Глава 7. Формы

7.1. Общая информация

Форма – это объект, созданный для ввода и просмотра какой-либо информации, а также для выполнения управления различными процессами. С помощью форм программа запрашивает у пользователя ту информацию, которая необходима ей для дальнейшей работы, либо выдает какую-либо информацию пользователю для просмотра и редактирования.

Основное назначение формы – предоставить пользователю удобное средство для ввода и просмотра информации. Как и бумажный документ, форма позволяет быстро ввести необходимую информацию и запомнить ее для последующей обработки, а при необходимости вновь вернуться к ранее введенным данным для просмотра или корректировки.

Отображаемая часть формы (видимая пользователю) описывается как дерево, включающее элементы формы. Элементы могут представлять собой поля ввода, флажки, переключатели, кнопки и т. д. Кроме того, элемент может быть группой, включающей другие элементы. Группа может представляться как панель с рамкой, панель со страницами (закладками), собственно страница, командная панель. Помимо этого элемент может представлять собой таблицу, которая тоже включает элементы (колонки). Структура элементов описывает то, как будет выглядеть форма. А вся функциональность формы описывается в виде реквизитов и команд. Реквизиты – это данные, с которыми работает форма, а команды – выполняемые действия. Таким образом, разработчик в редакторе формы должен включить в форму необходимые реквизиты и команды, создать отображающие их элементы формы и, если необходимо, скомпоновать элементы в группы.

Система может автоматически создавать форму прикладного объекта, но разработчик может сам создать форму и определить состав ее реквизитов, команд и отображаемых элементов. На основе этого логического описания система автоматически формирует внешний вид формы для отображения пользователю. При этом системой учитываются различные свойства отображаемых данных (например, тип), чтобы максимально удобно для пользователя расположить элементы формы. Разработчик может влиять на расположение элементов различными установками. Он может определять порядок элементов, указывать желаемую ширину и высоту. Однако это является только некоторой дополнительной информацией, помогающей системе отобразить форму.

В формах разработчик может использовать не только команды самой формы, но и глобальные команды, используемые в командном интерфейсе всей конфигурации. Кроме того, реализована возможность создания параметризуемых команд, которые будут открывать другие формы с учетом конкретных данных текущей формы. Например, это может быть вызов отчета по остаткам на том складе, который выбран сейчас в форме расходной накладной.

В формах существует механизм привязки сообщений, выдаваемых пользователю, к данным формы. Это позволяет системе визуально отмечать и активизировать элементы формы, при заполнении которых пользователь допустил ошибку.

Также форма автоматически учитывает ролевую доступность данных. Так, например, если какой-либо реквизит отображаемого объекта недоступен для просмотра определенному пользователю, то система автоматически удалит связанный с этим реквизитом элемент формы и перестроит форму.

Форма создается в редакторе формы, который доступен в режиме Конфигуратор (см. здесь). В этом редакторе определяются:

Реквизиты формы – предназначены для хранения данных, с которыми работает форма (см. здесь).

Параметры формы – предназначены для организации связи между формами и управления функциональностью формы при ее открытии (см. здесь).

Команды формы – предназначены для выполнения различных действий внутри формы (см. здесь).

Модуль формы – содержит программный код, связанный с функционированием формы (см. здесь).

Элементы формы – предназначены для отображения и редактирования реквизитов формы, а также для отображения и выполнения команд (см. здесь).

Командный интерфейс – содержит команды, которые могут выполняться в форме и предоставлены глобальным командным интерфейсом и командами формы (см. здесь).

ВНИМАНИЕ! Формы одновременно присутствуют и на стороне сервера, и на стороне клиента. Об этом всегда следует помнить при разработке формы.

7.2. Реквизиты формы

7.2.1. Общая информация

Набор реквизитов формы описывает состав данных, которые отображаются, редактируются и хранятся в форме. При этом реквизиты формы сами по себе не обеспечивают возможности отображения и редактирования данных. Для отображения и редактирования служат элементы формы, связанные с реквизитами формы. Совокупность всех реквизитов формы будем называть данными формы.

ВНИМАНИЕ! Необходимо помнить, что все данные формы должны быть описаны в виде реквизитов. Не допускается использование переменных модуля формы в качестве источников данных для элементов формы.

В процессе разработки формы можно явно задать возможность просмотра и редактирования конкретных реквизитов формы, в разрезе ролей, с помощью свойств Просмотр и Редактирование (подробнее см. здесь). Кроме того, доступность того или иного реквизита в самой форме можно настраивать с помощью функциональных опций (подробнее о функциональных опциях см. здесь).

Имеется возможность назначить Основной реквизит формы, т. е. реквизит, который будет определять стандартную функциональность формы (расширение формы).

ВНИМАНИЕ! Следует помнить, что основной реквизит у формы может быть только один.

Расширение формы – это дополнительные свойства, методы и параметры формы объекта УправляемаяФорма, характерные для типа основного реквизита формы.

7.2.2. Типы данных формы

Форма оперирует ограниченным набором типов данных:

● Типы, которые непосредственно используются в форме, – это те типы, которые существуют на стороне тонкого клиента и веб-клиента (например, Число, СправочникСсылка.Товары, ГрафическаяСхема, ТабличныйДокумент).

● Типы, которые будут преобразованы в специальные типы данных, – типы данных формы. Такие типы отображаются в списке реквизитов формы в круглых скобках, например (СправочникОбъект.Товары).

● Динамический список – специальный тип данных, который позволяет организовать отображение на форме произвольной информации из таблиц базы данных. Для этого необходимо указать отображаемую таблицу или описать получаемую выборку на языке запросов. Механизм основан на системе компоновки данных и предоставляет возможности для сортировки, отбора, поиска, группировки и условного оформления получаемых данных.

Некоторые прикладные типы (такие как СправочникОбъект и т. д.) не существуют на стороне тонкого клиента и веб-клиентов. Поэтому для представления в форме таких прикладных типов в платформе введены специальные типы данных, предназначенные для работы в формах. Эта особенность обуславливает необходимость выполнять преобразование прикладных объектов в данные формы (и обратно).

Используются следующие типы данных:

ДанныеФормыСтруктура – содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект.

ДанныеФормыКоллекция – это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. В коллекциях, полученных на основе наборов записей регистров или табличных частей объектов, поле элемента коллекции НомерСтроки не соответствует реальному индексу элемента коллекции. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.

ДанныеФормыСтруктураСКоллекцией – это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.

ДанныеФормыДерево – объект предназначен для хранения иерархических данных.

Внимание! Не рекомендуется использовать данные формы в качестве параметров процедур и функций, выполняющих передачу управления с клиента на сервер, а также в качестве возвращаемых значений функций, если при этом управление передается на клиента.

Внимание! При вызове серверных процедур и функций и возврате управления на клиента выполняется передача только изменений в данных формы. Если в качестве типа реквизита формы выбран тип Произвольный и в качестве значения реквизита выбрано мутабельное значение, то для того, чтобы данные между клиентом и сервером (и обратно) передавались корректно, нужно после изменения мутабельного значения снова его присвоить реквизиту формы.

Прикладной объект представлен либо одним, либо несколькими элементами данных формы. В общем виде иерархия и состав данных формы зависят от сложности и взаимосвязи прикладных объектов формы.

Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).

ВНИМАНИЕ! Во время разработки конфигурации важно помнить, что прикладные объекты доступны только на сервере, в то время как объектами данных форм можно пользоваться и на сервере, и на клиенте.

При формировании реквизитов формы необходимо учитывать ряд ограничений:

● В данных формы могут храниться данные только тех типов системы «1С:Предприятие», для которых указан возможность XDTO-сериализации (см. здесь).

● Запрещено присваивание реквизитам формы значений типа Массив и Соответствие.

● Для реквизитов произвольного типа объектов ДанныеФормыСтруктура, ДанныеФормыЭлементКоллекции, ДанныеФормыЭлементДерева, ДанныеФормыСтруктураСКоллекцией запрещается присваивание значений типа Массив и Соответствие.

● Не рекомендуется использовать значения типов Массив и Соответствие в качестве элементов коллекций типа Структура или СписокЗначений. В вышеперечисленных случаях рекомендуется использовать фиксированные коллекции: ФиксированныйМассив, ФиксированноеСоответствие.

● Не рекомендуется использовать типы Структура и СписокЗначений в данных реквизитов формы (т. е. в реквизитах реквизитов).

● Если реквизит формы имеет тип Произвольный или в качестве значения такого реквизита выступает коллекция (массив, соответствие и т. д.), то не следует устанавливать таким реквизитам (или свойствам коллекций) значения, содержащие прикладные объекты:

ДокументОбъект,

СправочникОбъект,

БизнесПроцессОбъект,

ЗадачаОбъект,

ПланВидовХарактеристикОбъект,

ПланВидовРасчетаОбъект,

ПланОбменаОбъект,

ПланСчетовОбъект,

ВнешнийИсточникДанныхКубТаблицаИзмеренияОбъект,

ВнешнийИсточникДанныхТаблицаОбъект.

Фактически можно сказать, что данные формы – это унифицированное представление данных различных прикладных объектов, с которыми форма работает единообразно, и которые присутствуют и на сервере, и на клиенте. То есть форма содержит некоторую «проекцию» данных прикладных объектов в виде своих собственных типов данных и выполняет преобразование между ними при необходимости. Однако, если разработчик конфигурации реализует свой алгоритм обработки данных, то преобразование данных (из специализированных типов в прикладные и обратно) он должен выполнять самостоятельно.

При редактировании реквизитов формы имеется возможность влиять на передачу данных между клиентом и сервером во время работы формы. Для этого служит колонка редактора реквизитов Использовать всегда. Действие этого свойства различается для трех типов реквизитов:

● Для реквизита, подчиненного динамическому списку (колонке динамического списка):

● Свойство включено – реквизит всегда считывается из базы данных и включается в данные формы.

● Свойство выключено – реквизит считывается из базы данных и включается в данные формы только тогда, когда есть видимый в данный момент элемент формы, связанный с реквизитом или его подчиненным реквизитом.

● Для реквизита, подчиненного коллекции движений:

● Свойство включено – движения документа считываются из базы данных и будут присутствовать в данных формы.

● Свойство выключено – движения документа не будут считываться из базы данных и не попадут в данные формы (если нет элемента формы, ссылающегося на движения документа).

● Остальные реквизиты формы:

● Свойство включено – реквизит будет присутствовать в данных формы вне зависимости от того, есть или нет хоть один элемент формы, который связан с реквизитом или его подчиненным реквизитом.

● Свойство выключено – реквизит будет присутствовать в данных формы только в том случае, если есть элемент формы, связанный с реквизитом или его подчиненным реквизитом. В отличие от реквизитов динамического списка, здесь не играет роли видимость элемента, связанного с реквизитом.

Примечание 1. Следует помнить, что свойство, установленное у родительского реквизита, действует на все подчиненные реквизиты. Например, если свойство Использовать всегда снято у табличной части документа, то система считает, что это свойство снято и у всех подчиненных реквизитов (несмотря на фактическое состояние свойства).

Примечание 2. Для реквизитов формы, имеющих объектный тип (СправочникОбъект, ДокументОбъект и т. д.), реквизиты Ссылка, ПометкаУдаления и ЭтоГруппа всегда присутствуют в данных формы (если соответствующий реквизит есть у объекта), вне зависимости от состояния свойства Использовать всегда.

Примечание 3. Запрещено присваивание реквизитам данных формы значений других объектов данных формы.

Если в редакторе реквизитов (колонка Тип) описание типа отображается в круглых скобках, например (СправочникОбъект.Товары), то это означает, что прикладной тип будет преобразован к типам, образующим данные формы.

Если в данных формы оказывается недопустимый тип (например, как реквизит реквизита формы), то в редакторе реквизитов формы, рядом с именем типа данного реквизита, будет выводиться надпись (Недоступен в данных формы). В режиме 1С:Предприятие поле формы, соответствующее данному реквизиту, не будет создано. Никаких ошибок выводиться не будет. При копировании и редактировании объектов, содержащих такие данные, следует самостоятельно реализовывать программный код, обеспечивающий копирование и работу с такими реквизитами в форме.

Далее рассмотрим некоторые особенности реквизитов форм разных типов:

● Для реквизитов формы типа ТаблицаЗначений и ДеревоЗначений имеется возможность добавлять колонки (команда Добавить колонку реквизита). Это определяет структуру данных создаваемой коллекции.

● Для реквизитов типа ДанныеФормыКоллекция (например, табличные части объектов) и ДанныеФормыСтруктураСКоллекцией (например, наборы записей регистров) имеется возможность задавать дополнительные колонки реквизитов (команда Добавить колонку реквизита), которые не имеют связи с данными, хранящимися в информационной базе.

Эти колонки будут создаваться системой в момент создания данных формы. Обращение к таким реквизитам доступно как на клиенте, так и на сервере.

Пример заполнения колонки реквизита, не связанной с данными:

Копировать в буфер обмена
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    Для Каждого Строка Из Объект.Товары Цикл
        // ВидТовара – реквизит, не связанный с данными
        Строка.ВидТовара = Строка.Товар.Вид;
    КонецЦикла
КонецПроцедуры

● Для реквизита типа СписокЗначений имеется возможность установить тип значения (свойство Тип значения), которое будет хранить список. При этом система будет автоматически ограничивать тип добавляемых данных при интерактивном добавлении. Также при этом не запрещается программное добавление, но будет выполняться попытка приведения значения добавляемого типа к ограничивающему типу (или составному типу). Свойство Тип значения также можно связать с элементом формы и получить возможность интерактивно ограничивать типы данных, которые могут быть добавлены в список значений.

● Для реквизита типа ДинамическийСписок имеется возможность задать параметры списка: основную таблицу, настройки и т. д. Подробнее см. здесь.

ВНИМАНИЕ! Колонки реквизитов, не связанные с данными, не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно.

Описание свойств Просмотр и Редактирование см. здесь.

Изменения данных формы отображаются элементами формы после окончания выполнения встроенного языка или после принудительного вызова метода ОбновитьОтображениеДанных(). Рассмотрим пример.

Допустим, в форме есть реквизит Счетчик типа Число. Этот реквизит отображается на форме полем типа Поле индикатора. Пусть есть некоторое действие, ход выполнения которого должен отображаться индикатором. Действие вызывается нажатием кнопки на форме:

Копировать в буфер обмена
Процедура ОбработчикКомандыФормы()
    Для Счетчик=1 по 100 Цикл
        ВыполнитьДействие();
    КонецЦикла
КонецПроцедуры

Если нажать кнопку, инициирующую эту команду, в режиме 1С:Предприятия, то индикатор вначале будет в крайнем левом положении, а потом – сразу в крайнем правом (считаем, что метод ВыполнитьДействие() выполняется какое-то время, что должно позволить увидеть изменение индикатора). То есть индикатор будет обновлен только после того, как закончится исполнение обработчика команды.

Для того чтобы индикатор отображал ход выполнения процесса, нужно код обработчика заменить нижеследующим:

Копировать в буфер обмена
Процедура ОбработчикКомандыФормы()
    Для Счетчик=1 по 100 Цикл
        ВыполнитьДействие();
        ОбновитьОтображениеДанных();
    КонецЦикла
КонецПроцедуры

После такого изменения индикатор начнет изменяться во время исполнения кода, расположенного в обработчике команды.

Примечание. В веб-клиенте вызов метода ОбновитьОтображениеДанных() приведет к обновлению элементов формы только после окончания выполнения кода на встроенном языке.

7.2.3. Преобразование данных прикладных объектов в данные формы и обратно

Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:

ЗначениеВДанныеФормы(),

ДанныеФормыВЗначение(),

КопироватьДанныеФормы().

Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.

Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.

ЗначениеВДанныеФормы() – преобразует объект прикладного типа в данные формы.

ДанныеФормыВЗначение() – преобразует данные формы в объект прикладного типа.

КопироватьДанныеФормы() – производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.

При преобразовании данных формы в прикладные объекты и обратно используется кеширование объектов, но при этом выполняется проверка актуальности версии объекта в кеше.

Примечание. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) в форме с основным реквизитом преобразование выполняется автоматически.

Приведем пример, как использовать преобразование данных в собственных алгоритмах.

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ОбъектТовар = Товары.НайтиПоНаименованию("Кофейник").ПолучитьОбъект();
    ЗначениеВДанныеФормы(ОбъектТовар, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Записать()
    ЗаписатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьНаСервере()
    ОбъектТовар =     ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Товары"));
    ОбъектТовар.Записать();
КонецПроцедуры

Также у объекта УправляемаяФорма существуют методы, доступные на сервере:

ЗначениеВРеквизитФормы() – выполняет преобразование объекта прикладного типа в заданный реквизит формы.

РеквизитФормыВЗначение() – преобразует реквизит данных формы в объект прикладного типа.

Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений (см. здесь).

Также следует помнить, что при преобразовании в данные формы (как с помощью метода ЗначениеВДанныеФормы(), так и с помощью метода ЗначениеВРеквизитФормы()) объектов типа ТаблицаЗначений или ДеревоЗначений нужно учитывать следующую особенность: в преобразуемом объекте должны существовать все колонки, которые существуют в данных формы.

ВНИМАНИЕ! Колонки реквизитов, не связанные с данными (см. здесь), не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно. Колонки, отсутствующие в данных объекта, очищаются при преобразовании в данные формы.

Примечание. В качестве первого параметра методов РеквизитФормыВЗначение() и ДанныеФормыВЗначение() могут выступать только реквизиты формы следующих типов: ДанныеФормыСтруктура, ДанныеФормыКоллекция, ДанныеФормыСтруктураСКоллекцией, ДанныеФормыДерево.

Приведем пример использования этих методов.

Копировать в буфер обмена
&НаСервере
Процедура ПересчитатьНаСервере()
    // Преобразует реквизит Объект в прикладной объект.
    Документ = РеквизитФормыВЗначение("Объект");
    // Выполняет пересчет методом, определенным в модуле документа.
    Документ.Пересчитать();
    // Преобразует прикладной объект обратно в реквизит.
    ЗначениеВРеквизитФормы(Документ, "Объект");
КонецПроцедуры

7.2.4. Свойства реквизитов

Данный раздел содержит описание некоторых свойств реквизитов формы.

Заголовок – текст, который используется в качестве заголовка элемента формы, связанного с данным реквизитом, если не задано свойство элемента формы Заголовок.

Основной реквизит – определяет, что данный реквизит формы является основным и определяет расширение формы.

Сохраняемые данные – если для реквизита установлено это свойство, то интерактивное изменение такого реквизита будет приводить:

● К попытке блокировки связанного реквизита формы.

● Установке признака изменения у формы (флаг Модифицированность).

● Если у реквизита установлено свойство Сохраняемые данные и форма находится в режиме Только просмотр, то все элементы формы, связанные с этим реквизитом, также будут находиться в состоянии Только просмотр.

Проверка заполнения – определяет необходимость проверки данного реквизита на заполнение (значение свойства равно Выдавать ошибку). Проверка заполнения возможна только для реквизитов следующих типов:

● примитивных типов данных (Число, Строка, Булево, Дата, любые типы ссылок, стандартный период),

● список значений,

● дерево значений,

● таблица значений.

Примечание. Проверка заполнения реквизитов выполняется аналогично функции ЗначениеЗаполнено(). Проверка заполнения табличных частей подразумевает, что табличная часть считается заполненной, когда в ней присутствует хотя бы одна строка.

7.3. Специальные типы реквизитов формы

7.3.1. Динамический список

7.3.1.1. Общая информация

Динамический список является специальным типом данных, который позволяет отображать на форме произвольную информацию из таблиц базы данных. Для этого нужно указать таблицу, данные из которой необходимо отобразить, или описать получаемую выборку на языке запросов.

Механизм основан на системе компоновки данных (см. здесь) и предоставляет возможности для сортировки, отбора, поиска, группировки и условного оформления получаемых данных. При этом источником данных служит запрос, который либо формируется системой автоматически (на основании указанных данных), либо пишется разработчиком вручную.

Рис. 198. Варианты создания динамического списка

При создании реквизита формы типа ДинамическийСписок разработчик может выбрать два способа формирования запроса к данным:

● Заданием основной таблицы – в этом случае достаточно просто указать таблицу (свойство Основная таблица), из которой необходимо получать данные, и система будет автоматически формировать запрос к данным (см. правую часть на рис.198).

● Ручным формированием запроса – для этого нужно установить свойство Произвольный запрос (см. левую часть рис.198). После этого будет доступно ручное формирование запроса получения данных из информационной базы.

С помощью запроса можно выполнять выборку данных из нескольких таблиц, поэтому можно указать основную таблицу. Это нужно для того, чтобы динамический список мог определить, какие данные главные, а какие – второстепенные, и мог правильно выбирать и отображать информацию, а также предоставлять стандартные команды. Однако если в запросе невозможно определить основную таблицу, то ее можно не указывать, но тогда динамический список не будет предоставлять команды, связанные с основной таблицей. Кроме того, в этом случае (без указания основной таблицы) будет существенно снижена эффективность получения данных динамическим списком.

В целях повышения производительности, рекомендуется все соединения, используемые в произвольном запросе только для получения дополнительных данных, делать необязательными с помощью расширения языка запросов системы компоновки данных (см. здесь).

Для динамического списка, являющегося основным реквизитом формы, имеется возможность устанавливать значения отбора с помощью параметра формы Отбор (подробнее о параметрах формы см. здесь). Для этого необходимо, чтобы имя свойства структуры, находящееся в параметре Отбор, совпало с именем поля отбора динамического списка. В этом случае значение свойства структуры будет установлено в качестве правого значения элемента отбора. Если в качестве значения элемента параметра Отбор формы динамического списка передан массив, фиксированный массив или список значений, то в отбор добавляется условие с вариантом В Списке, в правое значение которого помещается список значений (в который преобразуются массив и фиксированный массив).

В качестве произвольного запроса в динамическом списке может выступать запрос, в котором для формирования значения какого-либо поля используется параметр, например:

Копировать в буфер обмена
ВЫБРАТЬ
    ВЫБОР
        КОГДА Доставка.Коэффициент = 1
            ТОГДА &Представление
        ИНАЧЕ Доставка. Коэффициент
    КОНЕЦ КАК Коэффициент
ИЗ
    Документ.ДоставкаПродукции КАК Доставка

При этом если тип значения параметра отличается от типа реквизита объекта (например, Реквизит1 имеет тип Число, а значение параметра – тип Строка), то для корректного отображения поля следует выполнить явное приведение значения параметра к нужному типу:

Копировать в буфер обмена
ВЫБРАТЬ
    ВЫБОР
        КОГДА Доставка.Коэффициент = 1
            ТОГДА ВЫРАЗИТЬ(&Представление КАК Строка(100))
        ИНАЧЕ Доставка. Коэффициент
    КОНЕЦ КАК Коэффициент
ИЗ
    Документ.ДоставкаПродукции КАК Доставка

Если поле, по которому устанавливается отбор, отключено с помощью функциональных опций, то отбор по такому полю не устанавливается, даже если значение отбора передано в качестве параметров формы или связей параметров выбора.

С помощью свойства Динамическое считывание данных динамическому списку указывается на необходимость считывать данные небольшими порциями (подробнее про способы получения данных динамическим списком и кешировании данных см. здесь). Независимо от этого признака действуют следующие условия:

● Если установлен режим просмотра в виде иерархического списка, будут считываться только данные текущей группы и данные всех родительских элементов (без подчиненных элементов).

● Если установлен режим просмотра в виде дерева, то будут считываться только данные открытых узлов дерева.

● Не поддерживается единовременная загрузка данных динамического списка в случае установленного иерархического просмотра (свойство Отображение установлено в значение Дерево) и начальном отображении дерева, установленном в значение Раскрывать все уровни. Для получения данных будет выполнено столько запросов к серверу, сколько узлов находится в отображаемом списке.

В рамках одного получения данных, динамический список повторно использует ранее созданные временные таблицы, при соблюдении следующих условий:

● В пакетном запросе списка отсутствует запросы после основного запроса пакета.

● Состав временных таблиц и полей в них неизменен с предыдущего выполнения пакетного запроса.

В своей работе динамический список использует значения следующих свойств реквизитов объектов метаданных:

● формат,

● формат редактирования,

● подсказка,

● признак выделения отрицательных значений,

● маска,

● признак многострочного режима,

● признак расширенного редактирования,

● режим пароля.

При отображении и редактировании отбора и параметров системы компоновки данных используется формат редактирования соответствующего поля.

7.3.1.2. Ограничения и особенности

При установке отбора в динамическом списке следует помнить, что отбор не действует на группы, если для динамического списка выбран режим отображения Иерархический список или Дерево. Под «группами» понимается элемент справочника или плана видов характеристик, у которого свойство ЭтоГруппа установлено в значение Истина.

Отборы, автоматически накладываемые динамическим списком на стандартные реквизиты Владелец, Родитель, Дата, Период и ЭтоГруппа, применяются стандартными средствами системы компоновки данных. Отборы, автоматически накладываемые динамическим списком на ключевые поля, могут применяться как стандартными средствами системы компоновки данных так и путем непосредственного добавления в текст запроса условия В на поля основной таблицы. В результате применения отборов средствами компоновки, они могут примениться как во вложенных запросах, так и в параметрах виртуальных таблиц.

При разработке динамических списков рекомендуется проверить все динамические списки с произвольными запросами. В процессе проверки следует убедиться, что если в запросе списка присутствуют вложенные запросы или виртуальные таблицы, и в них доступны для отбора поля с псевдонимами, совпадающими с псевдонимами стандартных реквизитов Владелец, Родитель, Дата, Период, ЭтоГруппа или ключевых полей, то эти поля действительно соответствуют стандартными реквизитам, с которыми у них совпадает псевдоним. Если это не так – следует изменить запрос что бы они совпадали или псевдоним отличался.

Если выбрано ручное формирование запроса, то на запрос налагаются некоторые ограничения:

● Не поддерживается использование инструкции ПЕРВЫЕ в запросе динамического списка.

● Не поддерживается отбор, сортировка и группировка:

● По реквизитам табличных частей.

● Поля представлений.

● Поле ВерсияДанных.

● Поле ИмяПредопределенныхДанных.

● Поле Вид таблицы плана счетов.

● Поле ВидДвижения таблицы регистра накопления.

● Поле ТипЗначения таблицы плана видов характеристик.

● Поле типа Тип;

● Поле типа Строка (неограниченной длины).

● Поле типа ДвоичныеДанные.

● Не поддерживается сортировка и группировка по полям Субконто<НомерСубконто> и ВидСубконто<НомерСубконто> таблицы ДвиженияССубконто регистра бухгалтерии.

● Не поддерживается группировка по полям, которые представляют собой выражения языка запросов, содержащие агрегатные функции.

● При выбранной основной таблице, запрос динамического списка имеет следующие ограничения:

● Не поддерживаются объединения.

● Не поддерживается использование секции УПОРЯДОЧИТЬ ПО. Следует использовать запрос без основной таблицы или задавать необходимое упорядочивание через настройки динамического списка.

● Если динамический список отображается в виде иерархического списка или дерева, то запись не будет отображена динамическим списком, если не отображается хотя-бы один родитель этой записи. Другими словами – для отображения элемента иерархического списка, динамический список должен отобразить также всех родителей этого элемента до вершины списка. При этом под вершиной списка подразумевается или собственно корневой элемент иерархического объекта, отображаемого динамическим списком или элемент, установленный в качестве свойства РодительВерхнегоУровня расширения таблицы формы для динамического списка.

Не поддерживается использование в качестве основной таблицы динамического списка следующих таблиц:

● Таблица, для которой отсутствует ключ, уникально идентифицирующий каждую запись таблицы (ссылка для объектных таблиц и ключ записи для таблиц регистров). Однако следующие таблицы могут быть установлены в качестве основной таблицы динамического списка (несмотря на отсутствие ключа):

● таблица Субконто регистра бухгалтерии;

● все виртуальные таблицы регистра бухгалтерии, кроме таблицы ДвиженияССубконто;

● таблицы значений констант (включая таблицу Константы);

● таблицы внешних источников данных без ключевых полей;

● таблицы кубов внешних источников данных;

● таблицы регистра накопления:

● таблица оборотов;

● таблица остатков;

● таблица оборотов и остатков.

● таблицы регистра расчета:

● таблица фактического периода действия;

● данных графика;

● базовых данных.

● Таблицы табличных частей объектов;

● Таблицы регистрации изменений (используемые в механизмах обмена данными);

● Таблицы последовательностей;

● Таблицы перерасчетов (используемые в механизмах периодических расчетов).

● Таблицы, которая используется в запросе только во внешнем соединении.

Другими словами, динамический список с указанной основной таблицей будет работать корректно в том случае, если в результате выполнения запроса, указанного в качестве источника данных, не увеличивается количество строк, получаемых из основной таблицы (с учетом наложенного отбора). Если же в результате выполнения запроса количество строк, получаемых запросом из основной таблицы, увеличивается, это будет приводить к нарушению уникальности ключа записей таблицы, отображаемой списком. В этом случае необходимо отключить использование основной таблицы динамического списка.

При работе динамического списка необходимо учитывать права доступа на реквизиты, отображаемые списком:

● На сторону клиента не передаются данные колонок динамического списка, которые помечены свойством Использовать всегда, но для которых у текущего пользователя отсутствует право Просмотр. Доступ к данным таких колонок (с помощью свойства ТекущиеДанные и метода ДанныеСтроки()) на стороне клиента невозможен.

● Если у текущего пользователя отсутствует право Просмотр на ключевое поле динамического списка, получение данных этим динамическим список приводит к ошибке нарушения прав доступа.

Для динамического списка, который отображает список перечисления, отсутствует возможность интерактивной настройки списка.

Состав колонок и настройки динамического списка связаны с полями запроса по псевдонимам полей выборки. Если в запросе для поля выборки псевдоним не задан явно и поле является системным, то в качестве псевдонима используется имя поля для английского варианта встроенного языка. Указанная связь означает, что при изменении (или явном указании псевдонима для поля, у которого использовался автоматический псевдоним) псевдонима поля запроса, формирующего данные динамического список, будут утеряны настройки реквизита динамического списка, элементы формы «потеряют» отображаемые реквизиты, настройки динамического списка станут неверными и т. д.

В том случае, если источником данных динамического списка является таблица (обычная или виртуальная), которая позволяет устанавливать отбор по периоду, то в том случае, если пользователь устанавливает период отображения в таком динамическом списке (команда Установить интервал дат…), заданные границы периода будут установлены в качестве значений отбора или параметров виртуальной таблицы. Если средствами расширения языка запросов для системы компоновки данных были явно указаны имена параметров виртуальной таблицы – будут установлены параметры с заданными именами. Таблицы, для которых возможно управлять периодом отображения или обработки данных:

● таблицы регистров (основные или виртуальные), для которых существует возможность отбора по периоду (для регистра расчета – по периоду регистрации);

● основные таблицы документов, бизнес-процессов и задач;

● основные таблицы журналов документов;

● основные таблицы последовательностей, таблицы границ последовательностей.

В качестве параметра запроса динамического списка может выступать массив или список значений. Однако если параметром является список значений, то в качестве значения отбора будет использовано только первое значение списка. В случае если динамический список использует запрос с параметрами, первоначальная установка значений параметров должна выполняться в обработчике ПриСозданииНаСервере.

При отображении данных динамического списка следует помнить о следующих особенностях:

● При программном изменении свойств динамического списка не происходит автоматического повторного заполнения командных панелей, связанных с этим динамическим списком.

● Если несколько полей сгруппированы в группу с режимом группировки В ячейке и в сгруппированных полях есть поле, которое отображается флажком, то этот флажок всегда будет отображаться первым в получившейся ячейке (левее текста).

В динамическом списке, при определении типа данных для полей, в состав выражений которых входят параметры, поля или литералы, результирующий тип определяется по типам полей и литералов. Если тип значения параметра не входит в результирующий тип данных – его значение будет усечено.

Например, в следующем примере поле будет иметь тип Число.

Копировать в буфер обмена
ВЫБОР
    КОГДА ЛОЖЬ
        ТОГДА 5
    ИНАЧЕ
        &Параметр
КОНЕЦ

Если присвоить параметру Параметр значение другого типа, в динамический список для этого поля будет получать значение 0 (значение по умолчанию для типа Число).

Если в подобной ситуации требуется выбирать параметр другого типа – рекомендуется использовать конструкцию языка запросов ВЫРАЗИТЬ. Например, если в приведенном выше примере требуется передавать в параметр строку не длиннее 100 символов, то следует заменить простое указание параметра, на выражение с явным приведением типа:

Копировать в буфер обмена
ВЫБОР 
    КОГДА ЛОЖЬ
        ТОГДА 5
    ИНАЧЕ
        ВЫРАЗИТЬ(&Параметр КАК Строка(100))
КОНЕЦ

7.3.1.3. Способы получения и кеширования данных динамическим списком

При получении данных для отображения динамический список использует один из трех способов:

1. Считывание из базы данных выполняется порциями с количеством элементов данных, несколько превышающим количество строк, одновременно отображаемых списком (но не менее 20). Не выполняется кеширование данных на сервере.

2. Считывание из базы данных выполняется страницами по 1 000 элементов данных. Выполняется кеширование данных на сервере. Иерархические данные кешируются: для каждого родителя кешируется не более 2 страниц элементов. На один динамический список кешируется не более 20 страниц элементов. Кеширование будет включено динамическим списком для следующих таблиц:

● Критерий отбора;

● Все таблицы регистра бухгалтерии, кроме основной таблицы и таблицы ДвиженияССубконто;

● Все таблицы регистра накопления, кроме основной таблицы;

● Все таблицы регистра сведений, кроме основной таблицы;

● Все таблицы регистра расчета, кроме основной таблицы;

● Виртуальная таблица ЗадачиПоИсполнителю;

● Таблицы внешних источников без ключей;

● Кубы внешних источников.

3. Считывание из базы данных выполняется страницами по 1 000 элементов. Первая порция равна 1 странице. Каждая следующая порция увеличивается на 1 страницу (при достижении конца предыдущей выборки). Чем ближе передвигается «точка просмотра» к концу отображаемых данных, тем большая выборка считывается из базы данных, в пределе становясь равной всем отображаемым данным. Выполняется кеширование данных на сервере. Максимальное количество записей в кеше и динамическом списке – 1 000 000.

В зависимости от того, что выбрано основной таблицей динамического списка и какое значение принимает свойство Динамическое считывание, используются те или иные способы считывания данных:

● В качестве значения свойства Основная таблица указана одна из следующих таблиц: план обмена, справочник, список документов, журнал документов, план видов характеристик, план счетов, план видов расчета, бизнес-процесс, задача, таблица точек бизнес-процесса:

● Ключ, идентифицирующий строку таблицы: Ссылка.

● Свойство Динамическое считывание:

● Установлено: используется способ 1 (описание способов приведено выше).

● Сброшено: используется способ 2 (описание способов приведено выше).

● В качестве значения свойства Основная таблица указана одна из следующих таблиц: основная таблица регистра сведений, регистра накопления, регистра бухгалтерии, регистра расчета, виртуальная таблица регистра бухгалтерии ДвиженияССубконто:

● Ключ, идентифицирующий строку таблицы: КлючЗаписи.

● Свойство Динамическое считывание:

● Установлено: используется способ 1 (описание способов приведено выше).

● Сброшено: используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана таблица критерия отбора или таблица задач по исполнителю (ЗадачиПоИсполнителю):

● Ключ, идентифицирующий строку таблицы: Ссылка.

● Свойство Динамическое считывание не применимо.

● Используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана виртуальная таблица регистра сведений СрезПервых или СрезПоследних:

● Ключ, идентифицирующий строку таблицы: КлючЗаписи.

● Свойство Динамическое считывание не применимо.

● Используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана одна из виртуальных таблицы регистров, кроме перечисленных выше:

● Ключ, идентифицирующий строку таблицы: Число.

● Свойство Динамическое считывание не применимо.

● Используется способ 3 (описание способов приведено выше).

● Свойство Основная таблица не указано, используется произвольный запрос:

● Ключ, идентифицирующий строку таблицы: Число.

● Свойство Динамическое считывание не применимо.

● Используется способ 3 (описание способов приведено выше).

Для отображения данные передаются на клиента порциями, размер которых аналогичен размеру порции в 1-м способе считывания данных (описан в начале данного раздела).

При создании формы, содержащей динамический список, первоначально на клиента передается 45 элементов данных каждого видимого динамического списка (если в списке более 45 элементов). Если динамический список отображает более 45 строк, то при открытии формы будет выполнен дополнительный серверный вызов для получения недостающих элементов данных.

7.3.1.4. Настройки динамического списка

Свойство Настройка списка – нажатие на гиперссылку Открыть приводит к открытию формы настройки отображения динамического списка. Настройка списка выполняется таким же образом, как и аналогичные операции в системе компоновки данных.

Рис. 199. Условное оформление динамического списка

Во время настройки динамического списка в конфигурации разработчик прикладного решения имеет возможность сделать следующее:

● задать поля, по которым необходимо проводить упорядочивание;

● описать отбор данных в списке;

● указать настройки условного оформления;

● задать поля, по которым необходимо группировать данные.

Задавать сортировку разработчику имеет смысл, если не устраивает устанавливаемая системой сортировка по умолчанию.

Совет. Следует помнить о том, что неудачный выбор полей сортировки (равно как отбора и группировки данных) негативно влияет на эффективность динамической выборки.

С точки зрения прикладного разработчика, настройки динамического списка состоят из нескольких частей, которые связаны между собой. Основным свойством, через которое можно управлять настройками динамического списка является КомпоновщикНастроек. Это объект содержит три набора настроек, которые при работе системы определяют окончательные настройки, применяемые к динамическому списку:

● Настройки – настройки, созданные в режиме Конфигуратора. Свойство динамического списка Порядок предоставляет быстрый доступ к свойству Настройки.Порядок компоновщика настроек динамического списка, таким образом, следующие конструкции являются эквивалентными: Список.Порядок и Список.КомпоновщикНастроек.Настройки.Порядок;

ПользовательскиеНастройки – это настройки, которые изменяет пользователь в режиме «1С:Предприятие»;

ФиксированныеНастройки – эти настройки задаются из встроенного языка. Также в этой свойство попадают значения отбора, которые передаются в форму с помощью ее параметров. Свойства динамического списка Отбор, Параметры, УсловноеОформление предоставляют быстрый доступ к фиксированным настройкам компоновщика настроек динамического списка. Другими словами, данные обращения являются эквивалентными: Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор и Список.Отбор.

При формировании окончательной настройки динамического списка, различные варианты настроек комбинируются следующим образом:

● Если какой-либо вид настроек целиком отмечен как пользовательский, то в результирующие настройки попадают пользовательские настройки (Список.КомпоновщикНастроек.ПользовательскиеНастройки). При этом если какие-либо элементы настроек отмечены как недоступные, то эти настройки будет помещены в результирующие настройки из свойства Список.КомпоновщикНастроек. Настройки.

● Если какой-либо вид настроек отмечен как пользовательский не целиком, а поэлементно, то:

● Элементы, отмеченные как пользовательские, попадут в результирующие настройки из свойства Список.КомпоновщикНастроек.ПользовательскиеНастройки.

● Элементы, отмеченные как недоступные, попадут в результирующие настройки из свойства Список.КомпоновщикНастроек.Настройки.

● Фиксированные настройки (Список.КомпоновщикНастроек.ФиксированныеНастройки) добавляются в результирующие настройки «как есть». При этом недопустима ситуация, когда в фиксированных и пользовательских настройках есть одноименные настройки, например отбор с одинаковым левым значением в условии.

Если в настройках динамического списка присутствуют настройки, которые отключены с помощью функциональных опций, эти настройки будут удалены из списка доступных настроек при получении данных динамического списка.

Управление тем, какие настройки будут доступны пользователю, а какие – нет, выполняется в окне настройки динамического списка.

Рис. 200. Управление включением в пользовательские настройки

Флажок в нижней части окна (см. рис. 200) отвечает за размещение в настройках (обычных или быстрых) всего вида настроек. Эта возможность доступна для отбора, порядка, группировки и условного оформления. Если настройки указаны с режимом редактирования Быстрый выбор, то в свойстве Группа пользовательских настроек таблицы формы, отображающей динамический список, необходимо указать пустую группу формы, в которой будут располагаться элементы, связанные с быстрыми пользовательскими настройками динамического списка. Если группа не указана – быстрые пользовательские настройки не будут отображены на форме. Также имеется возможность явно вызвать создание пользовательских настроек с помощью встроенного языка с помощью метода СоздатьЭлементыФормыПользовательскихНастроек() расширения динамического списка.

Также имеется возможность выбирать возможность размещения в пользовательских настройках конкретных элементов настроек. Эта возможность доступна для элементов отбора и условного оформления (см. рис. 200).

Если необходимо, чтобы при открытии динамического списка были загружены какие-либо специальные настройки, то это можно сделать двумя способами:

● С помощью параметра формы динамического списка ПользовательскиеНастройки. Данные, содержащиеся в этом параметре, будут помещены в пользовательские настройки динамического списка.

● С помощью параметра формы динамического списка КлючПользовательскихНастроек. Если при открытии формы указать этот параметр, то в динамический список, являющийся основным реквизитом формы, будут загружены пользовательские настройки, расположенные в хранилище настроек с указанным ключом.

7.3.1.5. Поиск в динамическом списке

Динамический список, расположенный на форме, предоставляет возможность выполнять интерактивный поиск в отображаемых данных. Поиск может осуществляться с помощью следующих инструментов: строки поиска, диалога поиска, поиска текущего значения, с помощью истории поиска и установкой периода (для динамических списков, отображающих документы). Результатом поиска выступает ограниченный набор записей динамического списка (из доступных данному пользователю), которые соответствуют критериям поиска.

Для управления возможностями поиска в динамическом списке предназначены три свойства таблицы управляемой формы, отображающей динамический список:

Положение строки поиска – определяет положение строки поиска. Может принимать следующие значения: Авто, Командная панель, Нет, Верх, Низ.

Рис. 201. Строка поиска в динамическом списке

Если значение этого свойства установлено в значение Командная панель, то в командной панели формы (если динамический список является основным реквизитом формы) или в командной панели, связанной с динамическим списком, будет отображаться строка поиска. Строка поиска, размещенная в командной панели, всегда прижимается к правому краю командной панели (вместе с кнопками, расположенными правее строки поиска).

Если свойство установлено в значение Нет, то строка поиска будет отсутствовать на форме, а при начале набора поисковой строки будет открываться диалог.

Если свойство установлено в значение Верх, то строка поиска будет расположена между командной панелью списка и таблицей, отображающей динамический список. Если свойство установлено в значение Низ, то строка поиска будет размещена сразу после таблицы, отображающей динамический список.

Если форма создана в «1С:Предприятии» версии 8.3.4 и младше – свойство установлено в значение Нет. Если форма создана в «1С:Предприятии» версии 8.3.5 и старше – свойство установлено в значение Авто. Реальное значение свойства в этом случае будет определяться следующим образом:

● Если свойство Режим совместимости установлено в значение Версия 8.3.4 (и ниже) – значение Нет;

● Если свойство Режим совместимости установлено в значение Не использовать или старше значения Версия 8.3.4 значение Командная панель.

Переход к строке поиска осуществляется следующим образом:

● Нажатием сочетания клавиш Ctrl+F;

● Мышью;

● При начале набора текста в динамическом списке (с учетом значения свойства динамического списка ПоискПриВводе).

Положение состояния просмотра – описывает, где будет отображаться состояние просмотра: по каким полям выполнялся поиск и какие значения искались в каждом поле. Может принимать следующие значения: Авто, Нет, Верх, Низ.

Рис. 202. Состояние поиска в динамическом списке

Если свойство установлено в значение Нет, то состояние просмотра будет отсутствовать на форме. В результате определить, выполнен поиск или нет, можно будет только по доступности кнопки Отменить поиск.

Если свойство установлено в значение Верх, то состояние просмотра будет расположено между командной панелью списка и таблицей, отображающей динамический список. Если свойство установлено в значение Низ, то состояние просмотра будет размещено сразу после таблицы, отображающей динамический список.

Если форма создана в «1С:Предприятии» версии 8.3.4 и младше – свойство установлено в значение Нет. Если форма создана в «1С:Предприятии» версии 8.3.5 и старше – свойство установлено в значение Авто. Реальное значение свойства в этом случае будет определяться следующим образом:

● Если свойство Режим совместимости установлено в значение Версия 8.3.4 (и ниже) – значение Нет;

● Если свойство Режим совместимости установлено в значение Не использовать или старше значения Версия 8.3.4 значение Верх;

Положение управления поиском – определяет, где будет отображаться кнопка управления поиском. Кнопка открывает меню, которое содержит следующую информацию: команды Найти по текущему значению, Расширенный поиск, Отменить поиск, Установить период (для списков документов и журналов) и история поисковых запросов (последние 5 запросов). Свойство может принимать значения: Авто, Нет, Командная панель.

Рис. 203. Управление поиском в динамическом списке

Если свойство установлено в значение Нет, то кнопка управления поиском будет отсутствовать на форме (но команды будут доступны с помощью меню Еще). Значение свойства Командная панель размещает кнопку на командную панель, связанную с таблицей, отображающей динамической список.

Если форма создана в «1С:Предприятии» версии 8.3.4 и младше – свойство установлено в значение Нет. Если форма создана в «1С:Предприятии» версии 8.3.5 и старше – свойство установлено в значение Авто. Реальное значение свойства в этом случае будет определяться следующим образом:

● Если свойство Режим совместимости установлено в значение Версия 8.3.4 (и ниже) – значение Нет;

● Если свойство Режим совместимости установлено в значение Не использовать или старше значения Версия 8.3.4 – значение Командная панель;

Если на форме присутствуют несколько командных панелей, источником команд для которых является одна таблица управляемой формы (отображающая данные динамического списка), то строка поиска и кнопка управления поиском будет располагаться только в одной командной панели:

● Или в командной панели самого динамического списка (если для нее включено автоматическое заполнение)

● Или в любой из оставшихся командных панелей.

Рассмотрим особенности использования поиска в динамическом списке:

● Для того чтобы поиском было удобно пользоваться (в том числе и с точки зрения быстродействия) необходимо включить полнотекстовый поиск для всех объектов конфигурации, которые могут использоваться в качестве основной таблицы динамического списка. Также в полнотекстовом поиске должны участвовать все реквизиты объектов конфигурации, которые могут отображаться в динамическом списке и по которым может потребоваться поиск.

Если объект исключен из полнотекстового поиска, то рассматриваемый механизм поиска будет работать, но производительность такого поиска будет крайне низкой. Не рекомендуется использовать поиск по объектам, которые не индексируются полнотекстовым поиском.

● В прикладном решении должно быть регламентное задание, которое регулярно обновляет индекс полнотекстового поиска.

● Поиск выполняется не по всем колонкам динамического списка (и объекта конфигурации), а только по тем колонкам, которые отображаются в таблице.

● Поиск в динамическом списке по полям ссылочных типов с произвольным представлением выполняется по полям, которые используются для формирования представления (см. здесь). Поля, входящие в представление, получаются с учетом обработчика ОбработкаПолученияПолейПредставления() соответствующего объекта.

● Для динамических списков с указанной основной таблицей используется полнотекстовый поиск по основной таблице. Также выполняется полнотекстовый поиск по полям, отображаемым в списке из других таблиц (если для поля и объекта конфигурации используется полнотекстовый поиск). Результат полнотекстового поиска для основной таблицы используется в качестве отбора по ссылочному полю. Без включенного полнотекстового поиска данные могут быть найдены, но сам поиск будет выполняться очень медленно.

● В том случае, если для поля основной таблицы динамического списка используется отбор с видом сравнения Равно, то при выполнении полнотекстового поиска к поисковому запросу по этой таблице будет добавлено значение отбора.

● Строка поиска разбивается на слова. Это разбиение выполняется по следующим правилам:

● строка разбивается, используя символы пробела и табуляции в качестве разделителей;

● затем обрабатывается каждый получившийся фрагмент:

● если фрагмент является представлением даты (с временем или без него) с учетом текущих региональных установок сеанса, то словом является этот фрагмент;

● иначе фрагмент разбивается далее, используя в качестве разделителей символы ",.-/\". В этом случае в качестве слова принимается каждый получившийся фрагмент строки.

● Для каждого слова формируется свой набор условий, которые объединяются «по ИЛИ». Этот набор условий формируется в том случае, если полнотекстовый поиск данного слова в таблице, из которой было получено данное поле, вернул хотя бы один объект или полнотекстовый поиск не использовался для этого поля. Условия формируются следующим образом:

● Для поля типа Строка условие имеет вид ИмяПоля ПОДОБНО %Слово%;

● Для поля типа Число условие имеет вид ИмяПоля=Значение, где Значение – это слово, которое приведено к типу Число. Если приведение выполнить невозможно – поиск по полю выполняться не будет;

● Слово ищется как подстрока в представлении по умолчанию для типа Булево, определенное для текущего сеанса. Если искомое слово обнаружено в представлении, то в дальнейшем выполняется поиск значения, соответствующего представлению, в котором обнаружено слово. При этом для поиска не используются представления, которые заданы с помощью свойства элемента формы Формат.

● Для поля типа Дата условие имеет вид ИмяПоля>= НачалоДня(Слово) И ИмяПоля<=КонецДня(Слово);

● Для ссылочных полей выполняется поиск по полям, использующимся для формирования представления ссылки. В каждом из этих полей поиск выполняется по правилам, описанным выше. Для поиска не используются поля, используемые для формирования произвольного представления данных (см. здесь).

Набор условий для каждого слова объединяются «по И».

● Для значений с ведущими нулями, выполнять поиск можно как по строке с ведущими нулями, так и по строке, указанной без ведущих нулей.

● Если динамический список отображает список документов или журнал документов, то заданный интервал просмотра списка также отображается в области формы, отведенной для отображения состояния просмотра для необходимого динамического списка.

● Команда поиска по текущему значению не доступна в том случае, если основной таблицей динамического списка является критерий отбора.

● Найденные фрагменты строк выделяются при отображении в таблице.

● Для одной колонки поддерживается поиск только по одной поисковой строке. При добавлении нового поискового запроса для колонки, по которой уже выполняется поиск, произойдет замена поискового выражения, а не сложение двух поисковых запросов.

● Если на форме отсутствует дополнение элемента формы вида Отображение строки поиска, связанное с таблицей (свойство Источник дополнения элемента формы), отображающей динамический список, то нажатие сочетания клавиш Ctrl+F приводит к открытию диалога поиска.

Рис. 204. Диалог поиска

Если на форме присутствует дополнение элемента формы вида Отображение строки поиска, связанное с таблицей (свойство Источник дополнения элемента формы), отображающей динамический список, то для открытия диалога поиска следует использовать команду Расширенный поиск.

● При использовании диалога поиска нужно помнить о следующих особенностях:

● Открытие диалога поиска по сочетанию клавиш приводит к тому, что значение текущей ячейки оказывается в строке Что искать, а значение переключателя Как искать устанавливается в значение По точному совпадению.

● Открытие диалог поиска путем непосредственного начала набора поисковой строки в динамическом списке приводит к тому, что значение переключателя Как искать устанавливается в значение По части строки, а набираемый текст попадает в поле Что искать.

7.3.1.6. Получение данных, отображаемых динамическим списком

При использовании динамических списков может потребоваться выполнить различные действия с данными, которые в данный момент отображаются динамическим списком, с учетом наложенных отборов и примененного поиска. К таким действиям относятся: обработка отображаемой информации, например, перепроведение выделенных документов или установка какого-либо реквизита у выделенных объектов, формирование списка доступных объектов (с оформлением и т. д.), например, для печати или сохранения в табличный документ.

Для получения данных, которые отображаются динамическим списком, следует использовать методы ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных().

Пример получения данных:

Копировать в буфер обмена
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Возврат ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Получение данных в коллекцию значений (таблица или список значений) выполняется аналогично (см. здесь).

Получение данных динамического списка указанным образом имеет ряд особенностей, которые нужно учитывать при разработке прикладных решений:

● Не поддерживается следующее оформление таблицы:

● Чередование цветов строк;

● Картинка шапки;

● Картинка подвала;

● Цвет фона подвала;

● Цвет текста подвала;

● Шрифт подвала;

● Горизонтальное положение в подвале;

● Режим пароля.

● Не поддерживается условное оформление, указанное для управляемой формы;

● При упорядочивании иерархической таблицы по возрастанию, по полю типа Ссылка, записи, содержащие пустую ссылку всегда размещаются первыми.

7.3.2. Форматированный документ

В процессе разработки прикладных решений возникает необходимость предоставить пользователю возможность выполнять редактирование текстов с оформлением (далее форматированный документ). В качестве примера такой необходимости можно привести написание писем электронной почты, различных служебных записок или сопроводительных документов.

Для работы с форматированным документом предназначен объект ФорматированныйДокумент, с помощью которого можно выполнять программную обработку документа, и поле вида Поле форматированного документа, который предназначен для интерактивного изменения форматированного документа.

В информационной базе форматированный документ рекомендуется хранить в реквизите типа ХранилищеЗначения, в который помещается объект типа ФорматированныйДокумент.

Для того чтобы предоставить пользователю возможность интерактивного изменения документа, следует выполнить следующие шаги:

● Создать реквизит формы типа ФорматированныйДокумент и установить для него свойство Сохраняемые данные.

● Создать элемент формы типа Поле ввода вида Поле форматированного документа и связать его с ранее созданным реквизитом.

● При чтении данных формы (обработчик ПриЧтенииНаСервере()) загрузить в реквизит формы документ (метод УстановитьHTML()), который необходимо редактировать, предварительно получив его из информационной базы.

● Перед записью данных формы (обработчик ПередЗаписьюНаСервере()) получить результат (метод ПолучитьHTML()) редактирования документа и поместить его в реквизит, сохраняемый в информационной базе.

В процессе работы с документом можно использовать закладки. Закладкой называет позиция в документе. При определении позиции нужно учитывать следующие особенности:

● содержимое документа считается одной последовательностью символов;

● перенос строки считается одним символом;

● картинка считается одним символом.

С помощью закладок можно получать и устанавливать выделение или позицию курсора в редакторе, добавлять и удалять элементы текста в документе (собственно текст, картинка, перевод строки).

Если при получении выделения позиция начала и позиция окончания совпадают, это значит, что выделение отсутствует и получено положение курсора. Так же и при установке выделения: если начальная и конечная позиция выделения совпадают, происходит изменение позиции курсора, без выделения. Также следует помнить, что при программном изменении выделенного текста не происходит отмены выделения. Выделение остается в тех же позициях, в которых оно было до программного изменения текста.

Приведем пример получения и установки выделения в редакторе форматированного документа.

Копировать в буфер обмена
// Содержимое – реквизит формы типа ФорматированныйДокумент
 // Редактор – элемент формы типа Поле форматированного документа
 // Начало – реквизит формы типа Число. Указывает позицию начала выделения.
 // Окончание – реквизит формы типа Число. Указывает позицию окончания выделения.
&НаКлиенте
Процедура ПолучитьВыделение()
     ПозицияНачала = 0;
     ПозицияОкончания = 0;
     Элементы.Редактор.ПолучитьГраницыВыделения(ПозицияНачала,ПозицияОкончания);
     Начало = Содержимое.ПолучитьПозициюПоЗакладке(ПозицияНачала);
     Окончание = Содержимое.ПолучитьПозициюПоЗакладке(ПозицияОкончания);
 КонецПроцедуры
&НаКлиенте
 Процедура УстановитьВыделение()
     ПозицияНачала = Содержимое.ПолучитьЗакладкуПоПозиции(Начало);
     ПозицияОкончания = Содержимое.ПолучитьЗакладкуПоПозиции(Окончание);
     Элементы.Редактор.УстановитьГраницыВыделения(ПозицияНачала,ПозицияОкончания);
 КонецПроцедуры

При выполнении операций удаления закладка, описывающая начало удаляемого фрагмента, может оказаться некорректной. Если при этом необходимо сохранить позицию начала удаляемого фрагмента, то следует воспользоваться позицией начала фрагмента. Так, пример замены выделенного текста другим текстом будет выглядеть следующим образом.

Копировать в буфер обмена
Процедура ВставитьСтрокуВТекущуюПозицию(Редактор, Содержимое, Строка)
    Перем Начало, Конец;
    Редактор.ПолучитьГраницыВыделения(Начало, Конец);
    Позиция = Содержимое.ПолучитьПозициюПоЗакладке(Начало);
    Содержимое.Удалить(Начало, Конец);
    Начало = Содержимое.ПолучитьЗакладкуПоПозиции(Позиция);
    Содержимое.Вставить(Начало, Строка);
    Закладка = Содержимое.ПолучитьЗакладкуПоПозиции(Позиция + СтрДлина(Строка));
    Редактор.УстановитьГраницыВыделения(Закладка, Закладка);
КонецПроцедуры

Если в форматированном документе присутствуют гиперссылки и форматированный документ отображается в режиме Только просмотр, то гиперссылки доступны для перехода. Переход выполняется в новом окне веб-браузера.

Также имеется возможность программного доступа к тексту форматированного документа. Сам текст состоит из объектов типа ПараграфФорматированногоДокумента, который доступен через свойство Элементы объекта ФорматированныйДокумент. При этом каждый параграф состоит из объектов типа ТекстФорматированногоДокумента, ПереводСтрокиФорматированногоДокумента и КартинкаФорматированногоДокумента (элементы форматированного документа). Доступ к этой коллекции обеспечивается через свойство Элементы объекта ПараграфФорматированногоДокумента. Границей элемента не обязательно является граница слова.

Например, следующий пример показывает перебор всех параграфов форматированного документа, содержащих текст, и отдельную обработку каждого параграфа.

Пример:

Копировать в буфер обмена
Для каждого Параграф Из Документ.Элементы Цикл
    Если Параграф.ТипПараграфа = ТипПараграфа.Обычный Тогда
        ОбработатьОбычныйПараграф(Параграф);
    ИначеЕсли Параграф.ТипПараграфа = ТипПараграфа.МаркированныйСписок Тогда
   ОбработатьСписок(Параграф);
    ИначеЕсли Параграф.ТипПараграфа = ТипПараграфа.НумерованныйСписок Тогда
        ОбработатьСписок(Параграф);
    Иначе
        Продолжить;
    КонецЕсли;
КонецЦикла;

Обработка элементов форматированного документа, входящего в состав параграфа, может оказаться полезной в том случае, если нужно, например, убрать все оформление в виде курсива или полужирного шрифта.

Пример:

Копировать в буфер обмена
Полужирный = Новый Шрифт(, , Истина);
Курсив = Новый Шрифт(, , , Истина);
Обычный = Новый Шрифт;
Для каждого Элемент Из Параграф.Элементы Цикл
    Если ТипЗнч(Элемент) = Тип("ПереводСтрокиФорматированногоДокумента") Тогда
        Продолжить;
    КонецЕсли;
    Если Элемент.Шрифт = Полужирный ИЛИ Элемент.Шрифт = Курсив Тогда
            Элемент.Шрифт = Обычный;
        КонецЕсли;
КонецЦикла;

При программной работе с текстом также могут помочь методы ПолучитьЭлементы() и СформироватьЭлементы(). Эти методы возвращают массив элементов форматированного документа. Чтобы увидеть разницу в работе этих методов, рассмотрим пример форматированного документа, содержащего следующую строку: 012 456 890. Строка состоит из 11 символов, где на месте символов 4 и 8 расположены пробелы. Необходимо получить элементы, которые расположены между позициями 2 и 9 этого документа.

Копировать в буфер обмена
ПозицияНачала = Документ.ПолучитьЗакладкуПоПозиции(2);
ПозицияОкончания = Документ.ПолучитьЗакладкуПоПозиции(9);
Результат = Документ.ПолучитьЭлементы(ПозицияНачала, ПозицияОкончания);
Для каждого Элемент Из Результат Цикл
 Сообщить("Текст – " + Элемент.Текст);
КонецЦикла;
Результат = Документ.СформироватьЭлементы(ПозицияНачала, ПозицияОкончания);
Для каждого Элемент Из Результат Цикл
    Сообщить("Текст – " + Элемент.Текст);
КонецЦикла;

Разница в работе этих методов будет в том, что метод ПолучитьЭлементы() возвращает все элементы, которые попадают между заданными закладками (включая все граничные элементы), т. е. рассматриваемом примере будет выведен следующий текст:

Копировать в буфер обмена
Текст – 012 456 890

А при работе метода СформироватьЭлементы() вывод будет следующий:

Копировать в буфер обмена
Текст – 2 456 8

Другими словами, при использовании метода СформироватьЭлементы() система формирует набор элементов таким образом, чтобы он включал в себя только то содержимое форматированного документа, которое ограничено закладками.

Нужно помнить, что метод СформироватьЭлементы() изменяет форматированный документ во время своего вызова и если (в рассматриваемом примере) после вызова метода СформироватьЭлементы() снова вызвать метод ПолучитьЭлементы(), то результат работы будет такой:

Копировать в буфер обмена
Текст – 2 456 8

Такой результат будет даже в том случае, если полученный, после вызова СформироватьЭлементы(), набор элементов никак не изменялся.

7.3.3. Планировщик

7.3.3.1. Общая информация

Объект Планировщик (далее планировщик) предназначен для визуализации различных операций, привязанных к дате и времени, с возможностью повторения этих событий с определенной периодичностью. Планировщик предназначен для отображения информации и не хранит каких-либо данных в информационной базе.

Общая схема работы выглядит следующим образом:

● Из информационной базы получаются данные, которые следует отобразить;

● Эти данные (в виде элементов) отображаются в планировщике;

● Пользователь редактирует элементы;

● Данные измененных элементов актуализируются в информационной базе.

Планировщик предоставляет возможность переопределять формы, используемые для редактирования элементов.

7.3.3.2. Устройство планировщика

7.3.3.2.1. Измерения

В планировщике всегда присутствует одно измерение – это шкала времени. Также прикладной разработчик может создать дополнительные измерения (коллекция Планировщик.Измерения), которые позволят конкретизировать назначение каждого элемента. Измерения не имеют приоритета друг перед другом, но на форме они «вкладываются» друг в друга согласно порядку добавления. Каждое измерение характеризуется значением произвольного типа, по которому в дальнейшем можно выполнять поиск требуемого измерения.

Копировать в буфер обмена
ИзмерениеЗал = Планировщик.Измерения.Добавить("Зал");
ЭлементИзмерения = ИзмерениеЗал.Элементы.Добавить(Перечисления.ВидЗала.Мужской);
ЭлементИзмерения = ИзмерениеЗал.Элементы.Добавить(Перечисления.ВидЗала.Женский);
ИзмерениеМастер = Планировщик.Измерения.Добавить("Мастер");
ЭлементИзмерения = ИзмерениеМастер.Элементы.Добавить("Иванов");
ЭлементИзмерения = ИзмерениеМастер.Элементы.Добавить("Петров");
ЭлементИзмерения = ИзмерениеМастер.Элементы.Добавить("Сидорова");

В этом примере планировщику добавляется два измерения:

Зал – описывает тип зала некоторой парикмахерской. Для определения типа зала служит перечисление ВидЗала с двумя значениями: Мужской и Женский.

Мастер – фамилия мастера, работающего в том или ином зале. Типом значения будет являться строка с фамилией мастера.

На форме планировщик будет выглядеть следующим образом:

Рис. 205. Два измерения

Если поменять порядок добавления измерений, то на форме это будет выглядеть следующим образом:

Рис. 206. Измененный порядок измерений

7.3.3.2.2. Элементы

На «пересечении» измерений и шкалы времени находится элемент. Элемент имеет следующие основные характеристики:

● Описание элемента;

● Дата и время начала и окончания действия или события, описываемого элементом;

● Значения всех измерений, заданных для данного экземпляра планировщика;

● Значение элемента;

● Параметры повторения элемента (для повторяющихся элементов).

В простейшем случае элемент создается следующим образом:

Копировать в буфер обмена
Элемент = Планировщик.Элементы.Добавить(Дата('20140606150000'), Дата('20140606154000'));
Элемент.Текст = "Постричь Василия";
Измерения = Новый Соответствие;
Измерения.Вставить("Зал", Перечисления.ВидЗала.Мужской);
Измерения.Вставить("Мастер", "Иванов");
Элемент.ЗначенияИзмерений = Новый ФиксированноеСоответствие(Измерения);

В данном примере создается элемент, который описывает событие, начинающееся 6 июня 2014 года в 15:00 и заканчивающееся в тот же день в 15:40. Событие будет происходить в мужском зале (значение измерения Зал установлено в значение Мужской) и мастером будет Иванов (значение измерения Мастер установлено в значение Иванов).

В результате элемент на форме будет отображаться следующим образом:

Рис. 207. Элемент в планировщике

У созданного элемента есть недостаток: этот элемент невозможно найти в коллекции элементов планировщика (коллекция Планировщик.Элементы) с помощью метода Найти(). Для того чтобы исправить недостаток, необходимо при создании элемента указывать в качестве значения элемента (свойство Значение) какое-либо уникальное значение, которое в дальнейшем позволит однозначно идентифицировать элементы в планировщике.

Одним из вариантов такого уникального идентификатора является следующее:

● Создается справочник События, состав свойств которого позволяет полностью описать сохраняемые элементы;

● Ссылка на элемент справочника События помещается в свойство Значение создаваемого элемента.

Таким образом, каждый элемент в планировщике будет однозначно идентифицироваться ссылкой на элемент справочника События, из которого получены данные для создания элемента.

Если при создании элемента указаны не все значения измерений, то такой элемент не будет отображаться в планировщике.

7.3.3.2.3. Шкала времени

В некоторых случаях удобно, чтобы шкала времени располагалась не вертикально справа, а вдоль какой-либо другой стороны элемента форма, отображающего планировщик. Это можно сделать с помощью изменения свойства Планировщик.ШкалаВремени.Положение. Так, если присвоить этому свойству значение ПоложениеШкалыВремени.Верх, то планировщик будет выглядеть следующим образом:

Рис. 208. Горизонтальная шкала времени

Кроме изменения положения, свойство шкалу времени можно различным образом настраивать. Первым вариантом настройки является возможность задать, в каких единицах будет измеряться шкала времени, и сколько таких единиц будет помещаться на шкале перед тем, как произойдет перенос в следующую колонку (или строку). Например, можно установить, что шкала времени будет измеряться в часах и в одной колонке (строке) будет помещаться 6 часов. В этом случае отображение в планировщике одного дня будет состоять из 4 колонок (строк), в зависимости от режима отображения шкалы времени: в сутках 24 часа и 6 часов в одной колонке (строке).

При отображении шкалы времени сверху, изображение будет выглядеть следующим образом:

Рис. 209. Кратность шкалы времени

На встроенном языке такое поведение задается следующим образом:

Копировать в буфер обмена
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.Час;
Планировщик.КратностьПериодическогоВарианта = 6;
Планировщик.ШкалаВремени.Положение = ПоложениеШкалыВремени.Верх;

Если заголовки с отметкой часа не нужны над каждым 6-ти часовым фрагментом, то такие перенесенные заголовки можно отключить, присвоив свойству Планировщик.ОтображатьПеренесенныеЗаголовкиШкалыВремени значение Ложь.

Следующим вариантом настройки шкал времени является изменение текущей шкалы времени или настройка дополнительных шкал времени (свойство Планировщик.ШкалаВремени.Элементы). Изменение шкалы времени необходимо в тех случаях, когда стандартная шкала времени не устраивает по каким-то причинам. Например, единицей шкалы времени выбран день, кратность шкалы времени установлена в 7 (неделя), а планировщик отображает интервал времени, больший 1 недели (например, месяц). В этом случае места соприкосновения различных дней, в рамках кратности периодического варианта, не будет визуально никак выделяться на форме:

Рис. 210. Граница двух периодов

Для того чтобы визуально отметить границу, необходимо добавить еще одну шкалу времени. Добавляемая шкала времени должна описывать целиком один день:

Копировать в буфер обмена
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;

В результате граница двух «соседних» дней станет более заметной:

Рис. 211. Разделение двух периодов

В данном примере можно сделать два улучшения: перенести дату перед временем и сменить формат отображения даты:

Копировать в буфер обмена
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;
ЭлементШкалыВремени.Формат = "Л=; ДЛФ=DD";
Планировщик.ШкалаВремени.Элементы.Сдвинуть(ЭлементШкалыВремени, -1);

Порядок следования шкал времени определяется их порядком в коллекции. В рассматриваемом примере добавляемая шкала оказывается после шкалы, созданной по умолчанию, поэтому созданная шкала будет сдвинута на 1 позицию ближе к началу коллекции. А с помощью свойства Формат задается то, каким образом будет отображаться время начала дня. В результате разделение периодов станет более понятным и очевидным:

Рис. 212. Изменен порядок шкал и формат представления

Также следует помнить, что из коллекции ШкалаВремени невозможно удалить элемент, если он единственный. Следовательно, вначале необходимо добавить новую шкалу времени, и лишь затем можно удалить автоматически добавленную шкалу времени.

7.3.3.2.4. Периоды отображения

Планировщик может отображать различные периоды времени. Период времени может быть один или несколько, периоды могут иметь произвольную длительность. Для установки периодов отображения служит коллекция Планировщик.ТекущиеПериодыОтображения. Периоды отображения следует задавать с учетом времени. Если задать период с помощью конструкции Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140601'), Дата('20140601'));, то будет отображена первая секунда 1 июня 2014 года. Для того чтобы день окончания периода отображался целиком, следует использовать функцию КонецДня() или явным образом указывать время окончания периода.

Отдельного внимания заслуживает взаимодействие заданных периодов отображения и кратности временной шкалы. Все добавленные периоды считаются одной непрерывной шкалой, и переносы шкалы времени обрабатываются именно по этой шкале. Допустим, необходимо отобразить 7-дневные интервалы на временной шкале для следующего набора периодов:

● 1 июня – 5 июня;

● 10 июня – 19 июня;

● 21 июня – 23 июня.

Планировщик настраивается следующим образом:

Копировать в буфер обмена
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
Планировщик.КратностьПериодическогоВарианта = 7;
Планировщик.ТекущиеПериодыОтображения.Очистить();
Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140601'), КонецДня(Дата('20140605')));
Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140610'), КонецДня(Дата('20140619')));
Планировщик.ТекущиеПериодыОтображения.Добавить(Дата('20140621'), КонецДня(Дата('20140623')));
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;
ЭлементШкалыВремени.Формат = "Л=; ДЛФ=DD";
Планировщик.ШкалаВремени.Элементы.Удалить(Планировщик.ШкалаВремени.Элементы[0]);

При такой настройке форма планировщика будет выглядеть следующим образом:

Рис. 213. Перенос шкалы времени с дискретными интервалами

На рис. 213 видно, что первые 7 дней целиком включили первый интервал (5 дней, с 1 июня по 6 июня) и 2 дня от второго интервала. Вторые 7 дней включили 7 дней второго интервала и третьи 7 дней включили остаток второго интервала и целиком третий интервал.

Еще одним способом задания отображения прерывистых интервалов служит задание свойств ОтступСНачалаПереносаШкалыВремени и ОтступСКонцаПереносаШкалыВремени. Данные свойства задаются в размерности свойства ЕдиницаПериодическогоВарианта. Другими словами, если единицей периодического варианта является день, то и отступ с начала или конца шкалы времени будет вычисляться в днях. Например, необходимо отобразить в планировщике июнь 2014 года таким образом, чтобы в каждом 7-дневном интервале отображались только первые 5 (или менее) дней. Для этого используется следующий код настройки планировщика (в примере не будет использоваться измерение Мастер из предыдущих примеров):

Копировать в буфер обмена
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
Планировщик.КратностьПериодическогоВарианта = 7;
Планировщик.ТекущиеПериодыОтображения.Очистить();
Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоМесяца('20140601'), КонецМесяца('20140601'));
Планировщик.ОтступСКонцаПереносаШкалыВремени = 2;
ЭлементШкалыВремени = Планировщик.ШкалаВремени.Элементы.Добавить();
ЭлементШкалыВремени.Единица = ТипЕдиницыШкалыВремени.День;
ЭлементШкалыВремени.Кратность = 1;
ЭлементШкалыВремени.Формат = "Л=; ДЛФ=DD";
Планировщик.ШкалаВремени.Элементы.Удалить(Планировщик.ШкалаВремени.Элементы[0]);

При такой настройке форма планировщика будет выглядеть следующим образом:

Рис. 214. Отступ с конца переноса шкалы времени

В данном случае весь июнь разбивается на следующие периоды:

1. 1 июня – 7 июня;

2. 8 июня – 14 июня;

3. 15 июня – 21 июня;

4. 22 июня – 28 июня;

5. 29 июня – 30 июня.

Затем из каждого интервала будет удалено то количество дней (с начала и конца интервала), которые заданы в свойствах ОтступСНачалаПереносаШкалыВремени и ОтступСКонцаПереносаШкалыВремени (соответственно) и получившиеся интервалы будут отображены. Последний интервал поглощается отступом целиком, но начало интервала все равно будет отображено (по аналогии с поведением при задании текущих периодов отображения).

Прикладной разработчик имеет возможность самостоятельно изменять периоды отображения при навигации пользователя по планировщику (например, с помощью колеса мыши). Для этого следует обработать событие ПриСменеТекущегоПериодаОтображения. Если параметр СтандартнаяОбработка в обработчике этого события будет установлен в значение Ложь, то периоды отображения, заданные в параметре ТекущиеПериодыОтображения, не будут применены и не произойдет смена периода отображения.

7.3.3.2.5. Переопределение форм редактирования элементов

Для редактирования элементов в планировщике существуют две формы: форма быстрого редактирования и форма редактирования события. Для переопределения форм редактирования используются следующие события:

ПередСозданием – в данном событии можно переопределить форму, которая будет использоваться при создании нового события. По умолчанию используется форма быстрого редактирования события.

ПередНачалоБыстрогоРедактирования – в данном событии можно переопределить форму, которая используется для быстрого редактирования события. По умолчанию используется форма быстрого редактирования события.

ПередНачаломРедактирования – в данном событии можно переопределить форму, которая используется для обычного редактирования события. Событие срабатывает в следующих случаях:

● В системной форме быстрого редактирования элемента нажата специальная кнопка. Если форма быстрого редактирования переопределена, то прикладному разработчику необходимо самому реализовать механизм открытия формы обычного редактирования события. В этом случае событие ПередНачаломРедактирования не используется.

● В контекстном меню элемента выбрана команда Редактировать;

● На элементе, отображаемом в планировщике, выполнен двойной щелчок мыши.

Для того чтобы получить параметры редактирования события следует воспользоваться свойством ВыделенныеЭлементы у элемента формы, отображающего планировщик.

Собственно переопределение формы выполняется следующим образом:

1. В обработчике нужного события открывается требуемая форма;

2. Параметр используемого обработчика СтандартнаяОбработка устанавливается в значение Ложь.

7.3.3.2.6. Повторяющиеся элементы

Элементы (см. здесь) бывают однократные и повторяющиеся. Повторяющиеся элементы обладают расписанием (или правилами повторения элементов). Расписание задается с помощью одноименного свойства (Расписание). Несколько элементов, образованных в результате задания расписания, образуют серию элементов. В рамках серии возможно как изменение параметров всей серии, так и изменение параметров одного, конкретного, элемента серии.

Повторяющиеся элементы по-разному представлены в коллекции элементов и при отображении на форме. В коллекции элементов повторяющийся элемент будет представлен в единственном числе и у этого элемента будет заполнено свойство Расписание.

При отображении на форме будут присутствовать все повторяющиеся элементы, однако возможность их перебрать система не предоставляет. В тоже время, при попытке отредактировать какой-либо элемент, образующий серию, свойство элемента формы ВыделенныеЭлементы будет содержать коллекцию из элементов планировщика, которые образуют серию для элемента с расписанием. У таких элементов не будет установлено свойство Расписание, но будет заполнено свойство Родитель.

Свойство Родитель будет ссылать на элемент, расписание которого привело к созданию серии, часть которой предполагается редактировать.

Если в форме планировщика выполнить ручное редактирование одного из элементов серии повторяющихся элементов, то в родительском событии серии станет заполнено свойство ЗамещающиеЭлементы. В данной коллекции будут указаны те элементы серии, для которых были изменены параметры (относительно родительского события). При создании структуры хранения данных об элементах, следует помнить о том, что в этой структуре необходимо хранить не только родительские элементы, но и элементы, для которых некоторые параметры отличаются от заданных для серии в целом.

Если редактируется элемент из серии, который является замещающим, то свойство ДатаЗамещения указывает на ту дату и время, которые были получены в результате первоначального создания серии системой.

7.3.3.3. Общая схема редактирования данных планировщика

Как было сказано ранее (см. здесь), планировщик не является средством хранения данных. Он является средством их (данных) отображения. Поэтому для хранения информации о событиях в информационной базе должна быть создана соответствующая структура данных, например, справочник.

Общая схема работы выглядит следующим образом:

1. Определяются общие параметры планировщика, количество измерений, настройки шкалы времени и т. д.

2. Определяется текущий период отображения планировщика;

3. В соответствии с установленным периодом отображения из информационной базы получаются данные об отображаемой информации, и выполняется создание нужных событий в элементе формы. В качестве значения свойства Значение для элемента планировщика используется ссылка на элемент справочника, хранящего данные.

4. При редактировании или удалении элементов запоминаются свойство Значение для событий, которые были изменены или удалены. Это можно сделать с помощью реквизитов формы, в которых будут сохраняться значения свойства Значение измененных или удаленных элементов.

Новые элементы можно будет определить по незаполненному свойству Значение у элемента. Для этого необходимо перебрать всю коллекцию Планировщик.Элементы.

5. При смене периода отображения выполняется создание элементов, которые принадлежат новому периоду отображения.

6. При успешном завершении работы с планировщиком, выполняется синхронизация данных планировщика и справочника, в котором хранятся данные элементов.

7.3.4. Диаграммы

7.3.4.1. Общие сведения

Диаграммой называют способ графического представления данных. Простой разновидностью диаграммы является график. График используется для отображения последовательного изменения величин во времени или в зависимости от изменения других величин. Например, с помощью графика можно продемонстрировать изменение цены товара в течение года.

Рис. 215. Пример графика

По вертикальной оси графика отмечены значения показываемой величины (цена), по горизонтальной оси – точки графика (месяцы). В случае необходимости отображения различных показателей на одном графике их величины показывают в виде отдельных серий.

Рис. 216. Пример графика c 2 сериями

В приведенном примере Яблоки и Яйца – серии диаграммы, месяцы – точки диаграммы.

Для наглядного отображения данных разного вида используют различные типы диаграмм. Доступны три типа данных для работы с диаграммами:

● Диаграмма (см. здесь);

● Диаграмма Ганта (см. здесь);

● Дендрограмма (см. здесь).

Далее каждый из основных видов диаграмм будет рассмотрен более подробно.

7.3.4.2. Диаграмма

7.3.4.2.1. Общие сведения

Реквизит формы типа Диаграмма отображается на управляемой форме с помощью поля формы вида Поле диаграммы.

Рис. 217. Диаграмма на форме

Для настройки свойств диаграммы предназначена специальная форма, вызов которой осуществляется либо из панели свойств (нажатием на гиперссылку Открыть с свойства Настройка) или с помощью команды Перейти контекстного меню элемента формы вида Поле диаграммы. Если форма настройки открывается с помощью команды перехода, то в диалоге Объект перехода следует выбрать не саму диаграмму, а форму настройки.

Рис. 218. Переход к настройкам диаграммы

Окно настройки позволяет детально настроить как диаграмму в целом, так и отдельные ее области.

Рис. 219. Форма настройки

Свойство Тип диаграммы определяет способ отображения данных. От выбора типа диаграммы зависит доступность отдельных ее свойств. Поле диаграммы состоит из трех областей:

1. область построения,

2. область легенды

3. область заголовка.

По умолчанию эти области расположены следующим образом:

Рис. 220. Области диаграммы

Область построения может содержать следующие элементы:

1. шкала точек,

2. шкала серий,

3. шкала значений,

4. таблица данных.

На диаграмме эти элементы могут располагаться следующим образом:

Рис. 221. Элементы диаграммы

Для отображения таблицы данных следует включить признак ОтображатьТаблицуДанных области построения диаграммы. Использование этого свойства доступно не для всех типов диаграмм.

7.3.4.2.2. Работа с диаграммами средствами встроенного языка
Работа с данными диаграммы

Связь объекта Диаграмма с данными может быть организована двумя способами.

Первый способ основан на возможности создавать серии и точки диаграммы, а также устанавливать их значения из встроенного языка. В следующем примере для диаграммы создается серия из десяти точек со случайными данными.

Копировать в буфер обмена
Генератор = Новый ГенераторСлучайныхЧисел;
Диаграмма.Очистить();
Диаграмма.Обновление = Ложь;
Серия = Диаграмма.Серии.Добавить("Серия");
Для Сч = 1 По 10 Цикл
    Точка = Диаграмма.Точки.Добавить("Точка № " + Строка(Сч));
    Значение = Генератор.СлучайноеЧисло(1, 10);
    Диаграмма.УстановитьЗначение(Точка, Серия, Значение);
КонецЦикла;
Диаграмма.Обновление = Истина;

При таком способе заполнения данных доступен метод Транспонировать(), позволяющий поменять местами серии и точки диаграммы. Возможность транспонирования может быть полезна при изменении типа диаграммы. Например, круговая диаграмма отображает значения, представленные в виде одной точки и набора серий. Чтобы показать те же данные на графике потребуется поменять местами серии и точки. Свойство Автотранспонирование позволяет включить режим, в котором необходимость транспонирования определяется автоматически в зависимости от типа диаграммы и структуры данных.

Второй способ заполнения данных диаграммы связан с использованием свойства ИсточникДанных. В качестве источника может быть использована таблица значений или область ячеек табличного документа.

Копировать в буфер обмена
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПродажиОбороты.Период КАК Период,
    |    ПродажиОбороты.СуммаОборот КАК Выручка
    |ИЗ
    |    РегистрНакопления.Продажи.Обороты(, , Месяц, ) КАК ПродажиОбороты
    |
    |УПОРЯДОЧИТЬ ПО
    |    Период";
РезультатЗапроса = Запрос.Выполнить();
ТаблицаИсходныхДанных = РезультатЗапроса.Выгрузить();
Диаграмма.СерииВСтроках = Ложь;
Диаграмма.ИсточникДанных = ТаблицаИсходныхДанных;

Если при создании серии или точки задано ее ключевое значение, то впоследствии можно выполнить поиск этой серии и точки. Ключевое значение содержится в свойстве Значение:

Копировать в буфер обмена
Точка.Значение = 1;
Серия.Значение = "Серия1";

Методы УстановитьТочку()/УстановитьСерию() позволяют найти точку или серию диаграммы по ключевому значению. Определив серию и точку, можно прочитать текущее значение в точке методом ПолучитьЗначение() или установить новое значение методом УстановитьЗначение().

Копировать в буфер обмена
// Поиск точки
Точка = Диаграмма.УстановитьТочку(4);
// Поиск серии
Серия = Диаграмма.УстановитьСерию("Серия1");
// Определение значения точки диаграммы
Значение = Диаграмма.ПолучитьЗначение(Точка, Серия).Значение;
// Изменение значения точки диаграммы
Диаграмма.УстановитьЗначение(Точка, Серия, Значение + 10);

Методы УстановитьТочку()/УстановитьСерию() создает новую точку (серию) диаграммы, если точка (серия) с указанным ключевым значением не найдена. Для новой серии заполняется свойство Значение. Эту особенность удобно использовать при заполнении диаграммы данными.

Пусть требуется показать на графике данные о продажах различных товаров помесячно. Товары образуют серии диаграммы, а периоды представляют точки. При обходе полученных запросом данных ссылка на один товар может встречаться многократно, если продажи этого товара имели место в различные месяцы. В такой ситуации удобно использовать методы УстановитьСерию()/УстановитьТочку() с указанием ключевых значений, чтобы избежать повторного создания элементов диаграммы:

Копировать в буфер обмена
Пока Выборка.Следующий() Цикл
    Серия = Диаграмма.УстановитьСерию(Выборка.Товар);
    Точка = Диаграмма.УстановитьТочку(Выборка.Период);
    Диаграмма.УстановитьЗначение(Точка, Серия, Выборка.Выручка);
КонецЦикла;
Ограничение количества отображаемых серий

Количество серий, используемых в диаграмме, может быть ограничено свойством МаксимумСерий. Данные тех серий, которые не отображаются диаграммой из-за ограничения количества, суммируются и показываются в отдельной сводной серии. Ограничение на количество серий задается свойствами МаксимумСерийКоличество или МаксимумСерийПроцент, в зависимости от значения свойства МаксимумСерий.

Например, на графике требуется показать изменение объемы продаж нескольким покупателям. При этом выручка по двум покупателям значительно превышает выручку по остальным. В этом случае количество серий диаграммы может быть ограничено тремя:

Копировать в буфер обмена
Диаграмма.МаксимумСерий = МаксимумСерий.Ограничено;
Диаграмма.МаксимумСерийКоличество = 3;

Для каждой из десяти серий будет определено максимальное значение по всем точкам, а на графике будут отображаться только две серии с наибольшими из определенных значений. Все оставшиеся данные будут показаны в виде одной сводной серии:

Рис. 222. Сводная серия

Настройка областей диаграммы

Для работы с диаграммой в целом предназначен объект Диаграмма. Для настройки свойств отдельных областей диаграммы используются его свойства ОбластьЗаголовка, ОбластьЛегенды и ОбластьПостроения, а также свойства ОтображатьЗаголовок и ОтображатьЛегенду.

Свойства объекта ОбластьПостроенияДиаграммы позволяют настраивать отображение шкалы диаграммы, таблицы данных и выводимых значений. Оформление области заголовка и области легенды осуществляется с помощью свойств объектов ОбластьЗаголовкаДиаграммы и ОбластьЛегендыДиаграммы.

Например, формат шкалы значений может быть установлен следующим образом:

Копировать в буфер обмена
Диаграмма.ОбластьПостроения.ФорматШкалыЗначений = "ЧДЦ=2; ЧРД=.; ЧРГ=' '; ЧГ=3,0";

Формат шкалы значений, как и другие свойства, можно настроить, используя палитру свойств области построения диаграммы:

Рис. 223. Свойства области построения

Режим сглаживания

Способ построения соединительной линии графика зависит от значения свойств РежимСглаживания и НатяжениеСглаживания.

По умолчанию значения в области построения диаграммы соединяются прямыми линиями. В режиме сглаживания ГладкаяКривая для соединения значений используются «гладкие кривые».

Рис. 224. Сглаживание

В верхней части рис. 224 изображена диаграмма с отключенным режимом сглаживания, а в нижней – с включенным режимом сглаживания и стандартным натяжением сглаживания.

Настройка полупрозрачности

Для отдельных видов диаграмм реализованы свойства РежимПолупрозрачности и ПроцентПолупрозрачности, которые позволяют управлять режимом и степенью прозрачности диаграммы.

Если в свойстве диаграммы РежимПолупрозрачности задан режим Использовать, то прозрачность диаграммы определяется значением свойства ПроцентПолупрозрачности. Если процент полупрозрачности установлен равным нулю, то используется процент полупрозрачности по умолчанию для данного вида диаграммы.

В режиме Авто прозрачность устанавливается автоматически с учетом значения свойства ПроцентПолупрозрачности, вида диаграммы и других факторов.

Обработка событий

Для поля диаграммы реализована возможность обработки событий. Событие Выбор возникает при выборе элемента диаграммы. Событие ОбработкаРасшифровки возникает при выборе элемента диаграммы, при условии, что для этого элемента задано значение свойства Расшифровка.

При стандартной обработке в отдельном окне отображается значение расшифровки. Например, в свойстве Расшифровка серии диаграммы может быть записана ссылка на элемент справочника Покупатели:

Копировать в буфер обмена
Серия = Диаграмма.Серии.Добавить();
Серия.Расшифровка = ТаблицаДанныхСтрока.Покупатель;

В этом случае при двойном щелчке мыши на названии серии будет открыта форма соответствующего элемента справочника.

Существует возможность реализовать произвольную «расшифровку» выбранного элемента. Например, показать список всех документов продажи по выбранному покупателю. Для этого событие ОбработкаРасшифровки может быть обработано, например, так:

Копировать в буфер обмена
&НаКлиенте
Процедура ДиаграммаОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПараметрыФормы = Новый Структура;
    // Передача ссылки на элемент справочника Покупатели 
    // в общую форму ДокументыПоПокупателю.
    ПараметрыФормы.Вставить("Покупатель", Расшифровка);
    ОткрытьФорму("ОбщаяФорма.ДокументыПоПокупателю", ПараметрыФормы);
КонецПроцедуры

Аналогично расшифровка может быть задана и обработана для точки или значения диаграммы.

7.3.4.2.3. Данные для диаграмм

Для демонстрации различных видов диаграмм используются следующий набор данных:

Оптовые покупатели

Розничные покупатели

Дилеры

14.03

6

8

6

15.03

5

9

4

16.03

9

8

6

17.03

5

4

7

В зависимости от типа диаграммы, серии могут располагаться как в строках, так и в столбцах.

Если диаграмма строится на другом наборе данных, этот набор данных приводится непосредственно в том разделе, где демонстрируется диаграмма. Как правило, в диаграммах (в примерах далее) отключается флажок Серии в строках.

7.3.4.2.4. График

График использует способ отображения, при котором соседние значения внутри серии соединяются линией.

Рис. 225. График

7.3.4.2.5. График по шагам

График по шагам отличается от обычного графика тем, что соседние значения соединяются не прямыми линиями, а ступенями.

Такой тип графика удобно использовать, чтобы подчеркнуть прерывистый характер изменения величины. Например, изменение остатков товаров на конец дня:

Рис. 226. График по шагам

7.3.4.2.6. График с накоплением

Особенностью графика с накоплением является то, что каждое выводимое значение учитывает в себе значения предыдущих серий в той же точке. Удобен, когда требуется оценить вклад каждой серии в общую сумму. Например, можно проследить изменение вклада каждой группы покупателей в общую сумму выручки.

Рис. 227. График с накоплением

7.3.4.2.7. График с областями

График с областями показывает закрашенной область между линией графика и осью базового значения.

Рис. 228. График с областями

7.3.4.2.8. График с областями и накоплением

График с областями аналогичен графику с накоплением, области между линиями графика и осью закрашиваются.

Рис. 229. График с областями и накоплением

7.3.4.2.9. График с областями нормированный

Нормированный график показывает вклад каждой серии в общую сумму значений в точке. Например, в первой точке значения серий 6, 8 и 6. Общая сумма равна 20, вклад первой серии составит 30%, второй – 40%, третьей – 30%.

Рис. 230. График с областями, нормированный

7.3.4.2.10. Гистограмма, гистограмма объемная, гистограмма горизонтальная, гистограмма горизонтальная объемная

Гистограмма используется для визуализации тех же данных, что и график, однако использует иной способ их отображения. Данные на гистограмме показаны в виде прямоугольников, размеры которых позволяют сопоставить значения разных серий в одной точке.

Рис. 231. Гистограмма

Серия гистограммы может быть отмечена с помощью свойства Индикатор. Такая серия показывается как график и не учитывается при создании сводных серий. Пример – отображение среднего значения показываемых величин.

Рис. 232. Гистограмма с индикатором

7.3.4.2.11. Гистограмма с накоплением, объемная, горизонтальная, горизонтальная объемная

Гистограмма с накоплением, как и график с накоплением (см. выше), позволяет включить в значение каждой серии значения всех предыдущих серий.

Рис. 233. Гистограмма с накоплением

Следует учитывать возможность гистограмм с накоплением соединять соседние значения внутри серии для удобства чтения отображаемых данных:

Копировать в буфер обмена
Диаграмма.СоединениеЗначенийПоСериям = ТипСоединенияЗначенийПоСериямДиаграммы.СоединениеКраев;
Диаграмма.ЛинииСоединенияЗначенийПоСериям = Новый Линия(ТипЛинииДиаграммы.Пунктир, 2);
Диаграма.ЦветСоединенияЗначенийПоСериям = WebЦвета.Красный;

В результате получается диаграмма следующего вида:

Рис. 234. Гистограмма с накоплением и соединением краев

Серия гистограммы с накоплением также может быть отмечена с помощью свойства Индикатор. Такая серия показывается как график и не учитывается при создании сводных серий.

7.3.4.2.12. Гистограмма нормированная, объемная, горизонтальная, горизонтальная объемная

Нормированная гистограмма, как и нормированный график, показывает вклад каждой серии в общую сумму значений в точке.

Рис. 235. Гистограмма нормированная

Для нормированных диаграмм доступно соединение значений внутри серии.

7.3.4.2.13. Круговая, круговая объемная

Данный тип диаграммы позволяет показать долю отдельного значения в общей сумме значений. Круговая диаграмма строится по данным одной точки и набора серий.

Рис. 236. Круговая

Если в данных круговой диаграммы присутствует несколько точек, то будут показаны значения той точки, которая указана в свойстве АктивнаяТочка диаграммы.

7.3.4.2.14. Биржевая, биржевая «свеча»

Биржевая диаграмма позволяет показать в одной точке четыре значения, характеризующие изменение показателя в течение периода времени. Набор показателей включает самое высокое значение показателя за период, самое низкое значение, а также максимальное и минимальное значения показателя в течение периода.

Биржевая диаграмма показывает данные одной серии. При этом значение первой точки используется как начальное значение показателя, значение второй точки – минимальное значение, третьей точки – максимальное, четвертой – значение на конец периода.

Таким образом, данные первых четырех точек отображаются в виде одной точки диаграммы. В качестве названия объединенной точки используется название первой точки группы. Аналогично объединяются данные следующих четырех точек.

Рис. 237. Биржевая

Биржевая диаграмма может содержать данные нескольких серий. В таком случае отображаются значения той серии, которая указана в свойстве АктивнаяСерия диаграммы.

7.3.4.2.15. Изометрическая обычная, непрерывная, лента, пирамида, водопад

Обычная изометрическая диаграмма аналогична графику, однако значения внутри серии показываются в виде прямоугольных параллелепипедов различной высоты. Позволяет отобразить динамику показателя в различных разрезах.

Рис. 238. Изометрическая

Изометрическая пирамида показывает значения в виде пирамид различной высоты. Изометрическая лента отображает изменение значений серии в виде ленты. Непрерывная изометрическая диаграмма представляет собой изометрическую ленту с заполненной областью под лентой. Водопад – разновидность изометрической диаграммы, у которой серии не имеют толщины.

Для диаграмм вида Изометрическая непрерывная, Изометрическая лента и Водопад допустимо использование свойств РежимСглаживания и НатяжениеСглаживания.

При отключенном режиме сглаживания для диаграммы вида Изометрическая лента возможно использование свойства Индикатор серии диаграммы. Серия с установленным признаком Индикатор отображается полупрозрачно, образуя пересечения с другими сериями.

7.3.4.2.16. Поверхность, каркасная поверхность, выпуклая поверхность, вогнутая поверхность, затененная поверхность, сотовая

Поверхностные диаграммы позволяют не только наблюдать изменение значения внутри серии, но и проследить зависимость значения от серии в одной точке.

Рис. 239. Поверхность

7.3.4.2.17. Радарный график, с областями, с накоплением, с областями и накоплением, с областями нормированный

Радарный график использует радарную шкалу для отображения данных. Точки расположены на окружности, значения обозначаются точками, находящимися на разном расстоянии от центра круга.

Рис. 240. Радарный

Назначение прочих разновидностей радарного графика аналогично соответствующим случаям с диаграммой типа График.

7.3.4.2.18. Измерительная

Измерительная диаграмма строится аналогично круговым диаграммам. Отличительная особенность измерительной диаграммы – в изображении шкалы в виде измерительной панели.

Использование измерительной панели позволяет наглядно отнести значение показателя к определенной группе.

Рис. 241. Измерительная

Выделение диапазонов значений производится добавлением полос измерительной панели. Коллекция полос доступна через свойство ПолосыИзмерительнойДиаграммы:

Копировать в буфер обмена
Полоса = Диаграмма.ПолосыИзмерительнойДиаграммы.Добавить();
Полоса.Начало = 5;
Полоса.Конец = 10;
Полоса.ЦветФона = WebЦвета.Зеленый;
Полоса.Текст = "Хорошо";

Измерительная диаграмма может показывать значения двумя способами: с помощью стрелки или в виде секторов. Требуемый способ задается в свойстве ОтображениеЗначенияИзмерительнойДиаграммы. Ниже приведен пример отображения диаграммы в виде секторов.

Рис. 242. Измерительная, секторами

7.3.4.2.19. Воронка, объемная, нормированная, нормированная объемная

Вид диаграммы Воронка похож на горизонтальную гистограмму. Значения отображаются в виде сегментов, образующих форму воронки при соответствующем наборе значений данных.

Для диаграмм Воронка и Воронка объемная значения отображаются шириной сегмента воронки. В диаграммах Воронка нормированная и Воронка нормированная объемная значения отображаются высотой сегмента воронки.

Рис. 243. Воронка продаж

На оформление воронки влияют значения следующих свойств диаграммы: ПробелыВоронки, ВысотаГорлаВоронки и ШиринаГорлаВоронки.

Для диаграмм вида Воронка, и Воронка объемная допустимо использование свойств РежимСглаживания и НатяжениеСглаживания.

7.3.4.3. Диаграмма Ганта

7.3.4.3.1. Общие сведения

Диаграмма Ганта является способом отражения длительности и последовательности процессов, которые показываются в виде полос, расположенных вдоль оси времени.

В поле диаграммы по умолчанию отображается область построения, область заголовка и область легенды. Для настройки свойств и управления видимостью областей предназначены свойства ОбластьЗаголовка, ОбластьЛегенды, ОбластьПостроения, ОтображатьЗаголовок и ОтображатьЛегенду.

В области построения диаграммы по горизонтали расположена шкала времени, по вертикали – шкала точек (процессов).

Рис. 244. Общий вид

7.3.4.3.2. Добавление данных

Для управления составом серий и точек используют свойства диаграммы Серии и Точки.

Для работы со значениями диаграммы предназначен объект ЗначениеДиаграммыГанта, который может быть получен методом ПолучитьЗначение(). Значение предоставляет доступ к коллекции интервалов.

Значение диаграммы Ганта отображается в виде одного или нескольких интервалов. Рассмотрим пример:

Копировать в буфер обмена
// Добавление серии.
СерияПлан = ДиаграммаГанта.Серии.Добавить();
СерияПлан.Текст = "План";
// Добавление точки.
ТочкаСтроительствоОфиса = ДиаграммаГанта.Точки.Добавить();
ТочкаСтроительствоОфиса.Текст = "Строительство офиса";
// Получение значения.
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаСтроительствоОфиса, СерияПлан);
// Добавление интервала.
Интервал = Значение.Добавить();
Интервал.Начало = '20130125';
Интервал.Конец = КонецДня('20130206');

Построенная таким образом диаграмма Ганта отображает единственный интервал, показывающий продолжительность процесса Строительство офиса:

Рис. 245. Один интервал

Точки и серии диаграммы Ганта могут образовывать иерархическую структуру. Например:

Копировать в буфер обмена
// Создание точек
ТочкаПланирование = ТочкаСтроительствоОфиса.Точки.Добавить();
ТочкаПланирование.Текст = "Планирование строительства";
ТочкаЗакупка = ТочкаСтроительствоОфиса.Точки.Добавить();
ТочкаЗакупка.Текст = "Закупка материалов";
ТочкаРасчистка = ТочкаСтроительствоОфиса.Точки.Добавить();
ТочкаРасчистка.Текст = "Расчистка территории";
// Создание интервалов
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаПланирование, СерияПлан);
ИнтервалПланированиеПлан = Значение.Добавить();
ИнтервалПланированиеПлан.Начало = '20130125';
ИнтервалПланированиеПлан.Конец = КонецДня('20130201');
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаЗакупка, СерияПлан);
ИнтервалЗакупкаПлан = Значение.Добавить();
ИнтервалЗакупкаПлан.Начало = '20130202';
ИнтервалЗакупкаПлан.Конец = КонецДня('20130204');
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаРасчистка, СерияПлан);
ИнтервалРасчисткаПлан = Значение.Добавить();
ИнтервалРасчисткаПлан.Начало = '20130128';
ИнтервалРасчисткаПлан.Конец = КонецДня('20130206');
// Настройка отображения
Диаграммаганта.РазвернутьТочку(ТочкаСтроительствоОфиса, Истина);

В результате на диаграмме будет отмечена продолжительность трех этапов процесса строительства, а также общая продолжительность строительства.

Рис. 246. Несколько интервалов

Для заполнения диаграммы Ганта данными удобно использовать методы УстановитьТочку() и УстановитьСерию(). Метод УстановитьТочку() (УстановитьСерию()) возвращает точку (серию) диаграммы, у которой в свойстве Значение содержится заданное ключевое значение, например, ссылка на элемент справочника. Если точка (серия) с таким ключевым значением не найдена, то создается новая точка (серия) и заполняется свойство Значение.

Примечание. Вторым параметром в методы УстановитьТочку() и УстановитьСерию() может быть передано ключевое значение родительской точки (серии). Если этот параметр не задан, то в качестве родителя создаваемой точки (серии) может быть автоматически установлена существующая точка (серия) с незаполненным свойством Значение.

7.3.4.3.3. Связи интервалов

Интервалы диаграммы Ганта могут быть связаны при необходимости отражения факта зависимости процессов. Объект ИнтервалДиаграммыГанта позволяет добавлять элементы в коллекцию связей диаграммы:

Копировать в буфер обмена
Связь = ИнтервалПланированиеПлан.Добавить(ИнтервалЗакупкаПлан);

В результате диаграмма примет следующий вид:

Рис. 247. Связи интервалов

По умолчанию связь отображается линей, направленной от окончания первого интервала в начало второго. При необходимости тип связи может быть изменен в свойстве ТипСвязи.

7.3.4.3.4. Настройка шкалы времени

Полный интервал времени диаграммы определяется автоматически по продолжительности всех показываемых интервалов, если свойство диаграммы АвтоОпределениеПолногоИнтервала содержит значение Истина. При выключении автоматическом определении следует использовать метод УстановитьПолныйИнтервал():

Копировать в буфер обмена
ДиаграммаГанта.АвтоОпределениеПолногоИнтервала = Ложь;
ДиаграммаГанта.УстановитьПолныйИнтервал('20150124', '20150209');

Шкала времени может быть дополнена новыми строками, для каждой из которых можно задать периодичность, формат отображения периода и другие свойства. Добавление новой шкалы времени для отображения недельных отметок выглядит следующим образом:

Копировать в буфер обмена
НедельнаяШкалы = ДиаграммаГанта.ОбластьПостроения.ШкалаВремени.Элементы.Вставить(0);
НедельнаяШкалы.Единица = ТипЕдиницыШкалыВремени.Неделя;
НедельнаяШкалы.Кратность = 1;

Диаграмма примет следующий вид:

Рис. 248. Недельная шкала времени

Следует учитывать, что в диаграмме Ганта заголовок элемента шкалы отображается только в начале соответствующего деления. Если начало деления не отображается (оказалось «левее» отображаемого диапазона), то заголовок не будет отображен на диаграмме.

На шкале времени могут быть размещены метки, доступные через коллекцию Метки элемента шкалы времени. Однако, надо помнить, что добавленная метка будет отображаться внутри той временной шкалы, для которой добавлялась метка. Рассмотрим пример добавления метки в недельную шкалу, добавленную ранее:

Копировать в буфер обмена
Метка = ЭлементШкалы.Метки.Добавить('20150204');
Метка.Текст = "Контроль";
Метка.ЦветЛинии = WebЦвета.Красный;

При этом диаграмма станет выглядеть следующим образом:

Рис. 249. Метка внутри шкалы

Такое размещение метки снижает наглядность восприятия метки и времени по выбранной шкале. Для улучшения восприятия можно добавить «фиктивную» шкалу, которая не будет иметь периодических меток, а уже для этого интервала добавлять метку (вместо предыдущего примера):

Копировать в буфер обмена
ФиктивнаяШкала = ДиаграммаГанта.ОбластьПостроения.ШкалаВремени.Элементы.Добавить();
ФиктивнаяШкала.ОтображатьПериодическиеМетки = Ложь;
Метка = ФиктивнаяШкала.Метки.Добавить('20150204');
Метка.Текст = "Контроль";
Метка.ЦветЛинии = WebЦвета.Красный;

Тогда диаграмма пример следующий вид:

Рис. 250. Метка внутри шкалы

Доступна возможность изменить цвет фона фрагмента диаграммы за указанный период. Например, можно выделить выходные дни:

Копировать в буфер обмена
ИнтервалФона = ДиаграммаГанта.ИнтервалыФона.Добавить('20150124', КонецДня('20150125'));
ИнтервалФона.Цвет = WebЦвета.БледноМиндальный;
ИнтервалФона = ДиаграммаГанта.ИнтервалыФона.Добавить('20150131', КонецДня('20150201'));
ИнтервалФона.Цвет = WebЦвета.БледноМиндальный;

Диаграмма примет следующий вид:

Рис. 251. Выделенные интервалы

7.3.4.3.5. Интерактивное редактирование интервалов

Данные диаграммы Ганта могут быть изменены как из встроенного языка, так и интерактивно. Для того чтобы пользователю была доступна возможность изменения расположения и размеров интервалов, необходимо использовать свойство Редактирование значения диаграммы.

В качестве примера добавим к данным диаграммы серию Факт и разрешим редактирование ее значения в точке Расчистка территории:

Копировать в буфер обмена
СерияФакт = ДиаграммаГанта.Серии.Добавить();
СерияФакт.Текст = "Факт";
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаСтроительствоОфиса, СерияФакт);
Интервал = Значение.Добавить();
Интервал.Начало = '20150125';
Интервал.Конец = КонецДня('20150206');
Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаРасчистка, СерияФакт);
// Разрешено интерактивное редактирование интервалов.
Значение.Редактирование = Истина;
Интервал = Значение.Добавить();
Интервал.Начало = '20150127';
Интервал.Конец = КонецДня('20150206');

На диаграмме станет доступно редактирование фактического значения:

Рис. 252. Редактируемый интервал

Интервал будет помечен (как на рисунке) после того, как попытаться изменить положение интервала с помощью мыши.

7.3.4.3.6. Обработка событий

Интерактивное изменение интервалов диаграммы Ганта приводит к появлению события ПриОкончанииРедактированияИнтервала. В обработчике события доступны свойства измененного интервала.

Например, в обработчике события можно реализовать проверку на выход интервала Расчистка территории за полный интервал диаграммы и отказ от редактирования, если продолжительность фактических данных вышла за полный интервал:

Копировать в буфер обмена
&НаКлиенте
Процедура ДиаграммаГантаПриОкончанииРедактированияИнтервала(Элемент, Интервал, ОтменаРедактирования)
    Если Интервал.Конец > ДиаграммаГанта.КонецПолногоИнтервала Тогда
        ОтменаРедактирования = Истина;
    КонецЕсли;
КонецПроцедуры

7.3.4.4. Дендрограмма

Дендрограмма представляет собой графический способ отображения степени сходства объектов. Поле дендрограммы содержит область построения и область заголовка. По умолчанию в области построения на горизонтальной оси перечислены сравниваемые объекты, по вертикали отмечена величина отличия между объектами.

Рис. 253. Дендрограмма

Разница в значениях элементов показана расположением соединительной линии.

В качестве примера представим на дендрограмме различия в цене двух товаров: яблоки – 10 рублей, груши – 12 рублей.

Рис. 254. 2 объекта

Данная дендрограмма из встроенного языка может быть сформирована следующим образом:

Копировать в буфер обмена
Яблоки = Дендрограмма.Элементы.Добавить();
Яблоки.Текст = "Яблоки (10 руб.)";
Груши = Дендрограмма.Элементы.Добавить();
Груши.Текст = "Груши (12 руб.)";
Связь = Дендрограмма.Связи.Добавить();
Связь.ПервыйЭлемент = Яблоки;
Связь.ВторойЭлемент = Груши;
Связь.Расстояние = 2;

Коллекция Элементы дендрограммы содержит перечень объектов, в нашем случае – товаров. Связи между объектами задаются в коллекции Связи.

Теперь добавим к сравнению третий товар: Апельсины, стоимостью 20 рублей. Для этого должен быть создан еще один элемент дендрограммы и установлена еще одна связь:

Копировать в буфер обмена
Апельсины = Дендрограмма.Элементы.Добавить();
Апельсины.Текст = "Апельсины (20 руб)";
Связь = Дендрограмма.Связи.Добавить();
Связь.ПервыйЭлемент = Яблоки;
Связь.ВторойЭлемент = Апельсины;
Связь.Расстояние = 8;

Дендрограмма будет иметь следующий вид:

Рис. 255. 3 объекта

Следует отметить, что расположение связей соответствует порядку их добавления. Добавление первой связи привело к объединению в группу элементов Яблоки и Груши. При создании второй связи автоматически учтено наличие связи, созданной ранее, поэтому вторая линия связывает элемент Апельсины с элементом, который образован связью элементов Яблоки и Груши:

Рис. 256. Объединение элементов

Настройка областей дендрограммы может быть выполнена с помощью свойств ОбластьЗаголовка и ОбластьПостроения. Например, может быть изменен формат шкалы значений:

Копировать в буфер обмена
Дендрограмма.ОбластьПостроения.ФорматШкалыЗначений = "ЧДЦ=2;";

Дендрограмма примет следующий вид:

Рис. 257. Формат шкалы значений

Режим автоматической настройки масштаба дендрограммы при изменении размеров формы определяется свойством ПоддержкаМасштаба:

ВсеЭлементы – все элементы отображаются в поле дендрограммы независимо от размеров формы.

КоличествоЭлементов – в видимой части дендрограммы отображается то количество элементов, которое задано в свойстве КоличествоЭлементовШкалы. Остальные элементы доступны при использовании полосы прокрутки.

МинимальнаяШирина – при уменьшении размеров формы размеры элементов могут уменьшиться до ширины, заданной в свойстве МинимальнаяШиринаЭлемента. Если в видимой части недостаточно места для отображения всех элементов, используется полоса прокрутки.

7.4. Параметры формы

7.4.1. Общая информация

Параметры формы (закладка Параметры) служат двум целям:

● Описать набор данных, которые будут влиять на открытие формы (параметризация формы). Для этого нужно перечислить все необходимые параметры и указать их типы.

● Определить параметры, которые будут влиять на ключ уникальности формы. Для этого необходимо установить свойство Ключевой параметр у тех параметров, которые должны участвовать в формировании ключа уникальности формы. При попытке открыть форму система производит поиск существующей формы с помощью сформированного ключа уникальности формы. Если в системе существует форма с полученным ключом уникальности, возвращается именно эта форма; если нет – создается новая форма.

При вызове формы значения параметров, созданных разработчиком, можно указывать в структуре параметров наряду с системными параметрами форм (если таковые имеются).

Параметры формы можно передать в форму в момент ее создания. Анализ переданных параметров можно выполнить в событии ПриСозданииНаСервере() (коллекция Параметры является свойством объекта УправляемаяФорма):

Копировать в буфер обмена
// В месте вызова.
// Формируем параметр формы.
Параметры = Новый Структура();
Параметры.Вставить("Важность", ПредопределенноеЗначение("Перечисление.Важность.Важно"));
// Открываем форму с указанием параметров.
ОткрытьФорму("ОбщаяФорма.ФормаПросмотра", Параметры);// В модуле формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 Если Параметры.Важность = Перечисления.Важность.Важно Тогда
 …
 КонецЕсли;
КонецПроцедуры

ВНИМАНИЕ! После вызова обработчика события ПриСозданииНаСервере все неключевые параметры формы удаляются из коллекции Параметры.

Совет. Неключевые параметры формы, необходимые для дальнейшей работы, нужно сохранять в данных формы.

7.4.2. Стандартные параметры формы

Для того чтобы поддерживать автоматическое взаимодействие между формами, система предоставляет ряд стандартных параметров, которые используются для управления формами при их открытии. С помощью этих параметров системой реализуется в полях форм выбор из форм выбора, открытие форм объектов, работа стандартных команд и т. д. То есть они обеспечивают различные заложенные в систему сценарии работы интерфейса. Но разработчик также может использовать эти параметры во встроенном языке, передавая их при вызове метода ОткрытьФорму().

Перечень стандартных параметров форм в зависимости от вида расширения формы можно посмотреть в разделах Встроенный язык – Интерфейс (управляемый) – Управляемая форма – Расширение… встроенной справки.

7.4.3. Пример работы с параметрами формы

Для демонстрации работы параметров формы рассмотрим реализацию выбора элемента в поле ввода. Сутью примера будет реализация механизма выбора элемента из списка на встроенном языке.

К моменту начала работы с примером нужно иметь конфигурацию, обладающую следующими свойствами:

● имеется справочник Товары с иерархией групп и элементов;

● имеется справочник Аналоги с реквизитом ВыбранныйТовар типа СправочникСсылка.Товары;

● оба справочника имеют формы элементов.

Теперь реализуем в этой конфигурации все механизмы, которые использует платформа для выбора элемента из списка, на встроенном языке. При этом мы увидим:

● как происходит использование стандартных параметров формы;

● каким образом их использует сама система;

● как их может использовать разработчик.

Добавим дополнительный параметр, который будет управлять закрытием формы выбора после выбора элемента. Назовем этот параметр ЗакрыватьПослеВыбора (тип Булево). Добавим его в качестве параметра формы ФормаВыбора справочника Товары.

Для того чтобы открыть форму выбора элемента, необходимо в форме элемента справочника Аналоги создать обработчик события НачалоВыбора у элемента формы ВыбранныйТовар.

Копировать в буфер обмена
&НаКлиенте
Процедура ВыбранныйТоварНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("РежимВыбора", Истина);
    ПараметрыВыбора.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы);
    ПараметрыВыбора.Вставить("РазрешитьВыборКорня", Ложь);
    ПараметрыВыбора.Вставить("ТекущаяСтрока", Объект.ВыбранныйТовар);
    ПараметрыВыбора.Вставить("ЗакрыватьПослеВыбора", Ложь);
    ОткрытьФорму("Справочник.Товары.ФормаВыбора", ПараметрыВыбора, Элементы.ВыбранныйТовар);
КонецПроцедуры

Следует отдельно остановиться на третьем параметре метода ОткрытьФорму(). Этот параметр определяет, кто будет владельцем формы выбора и кому будет приходить оповещение о сделанном выборе. В данном случае мы указали владельцем формы выбора сам элемент формы, но также мы можем указать этим параметром и саму форму. В этом случае будет необходимо реализовывать обработчик ОбработкаВыбора модуля формы и в нем решать, в какой реквизит формы помещать выбранные данные.

Примечание. Если мы не будем реализовывать обработчик события НачалоВыбора, то его действия выполнит сама система. Это справедливо и для всех дальнейших обработчиков, которые использованы в примере.

Теперь необходимо обработать переданные параметры в форме выбора. Сделаем это в обработчике ПриСозданииНаСервере() модуля формы выбора.

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Элементы.Список.ВыборГруппИЭлементов = Параметры.ВыборГруппИЭлементов;
    Элементы.Список.РазрешитьВыборКорня = Параметры.РазрешитьВыборКорня;
    Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяСтрока;
    ЗакрыватьПриВыборе = Параметры.ЗакрыватьПослеВыбора;
КонецПроцедуры

Для того чтобы проверить работоспособность установленных нами параметров формы, установим, с помощью конфигуратора, у таблицы формы выбора Список свойство ВыборГруппИЭлементов в значение Группы (без применения параметра не будет доступен выбор элементов справочника).

Примечание. Если у таблицы Список, отображающей список товаров, свойство РежимВыбора не будет установлено в значение Истина, то выбор товаров будет недоступен.

Теперь нам необходимо обработать выбор желаемого элемента в форме выбора. Для этого нужно определить обработчик события ВыборЗначения таблицы формы.

Копировать в буфер обмена
&НаКлиенте
Процедура СписокВыборЗначения(Элемент, СтандартнаяОбработка, Значение)
    СтандартнаяОбработка = Ложь;
    ОповеститьОВыборе(Значение);
КонецПроцедуры

Нам осталось реализовать обработку выбора элемента в самом поле ввода. Для этого необходимо обработать событие ОбработкаВыбора нашего поля ввода ВыбранныйТовар.

Копировать в буфер обмена
&НаКлиенте
Процедура ВыбранныйТоварОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Объект.ВыбранныйТовар = ВыбранноеЗначение;
КонецПроцедуры

Мы самостоятельно реализовали системный механизм выбора значения в поле ввода на форме.

ВНИМАНИЕ! Данный пример не является законченным. Его единственным назначением является демонстрация механизмов работы с параметрами формы.

Если при создании параметров (обработчик ВыбранныйТоварНачалоВыбора()) заменить строку:

Копировать в буфер обмена
    ПараметрыВыбора.Вставить("ЗакрыватьПослеВыбора", Истина);

на строку:

Копировать в буфер обмена
    ПараметрыВыбора.Вставить("ЗакрыватьПослеВыбора", Ложь);

то форма выбора перестанет закрываться после того, как будет осуществлен выбор. Это можно использовать, например, для реализации формы подбора (выбор нескольких товаров без закрытия формы выбора).

7.5. Команды формы

7.5.1. Общая информация

Действия в форме выполняются с помощью команд формы. Сами команды служат лишь описанием выполняемых действий. Для того чтобы команда стала выполнять свою функцию, она должна быть привязана к элементу формы (типа Кнопка). Можно выделить несколько групп команд, которые присутствуют в форме:

Команды, создаваемые разработчиком в процессе проектирования формы. Для них необходимо создавать обработчик непосредственно в модуле формы.

Стандартные команды, которые предоставляются расширением основного реквизита формы и расширениями реквизитов, которые являются списками (например, табличная часть объекта, динамический список, набор записей регистра сведений и т. д.), если с этим реквизитом есть связанный элемент формы.

Глобальные команды – команды, предоставленные глобальным командным интерфейсом (подробнее про командный интерфейс см. здесь). Такие команды могут быть непараметризованными и параметризованными. Параметризованные глобальные команды будут предоставлены форме только в том случае, если на форме есть источники параметров с соответствующими типами.

Доступность стандартных команд формы и элементов формы определяется свойством Состав команд соответствующего элемента формы.

Команды, которые предоставляет глобальный командный интерфейс (закладка Глобальные команды), могут быть размещены в любом месте формы, точно так же, как и команды формы.

В свойстве Действие указывается обработчик, который реализует действие, выполняемое командой. Если обработчик не задан, то команда будет недоступна для использования. К выбору в этом поле доступны только процедуры и функции без параметров, которые являются клиентскими (подробнее см. здесь).

Если команда изменяет данные формы, то следует указать на это установкой свойства Изменяет сохраняемые данные. Тогда при попытке выполнения команды будут выполняться следующие действия:

● Попытка выполнить блокировку основного реквизита формы. Если попытка закончится неудачей – команда не будет выполнена.

● Установлен признака изменения у формы (флаг Модифицированность).

Если для команды установлено свойство Изменяет сохраняемые данные и форма находится в режиме Только просмотр, то все элементы формы, связанные с этой командой, также будут находиться в состоянии Только просмотр.

Кроме того, исполнение параметризованной глобальной команды, для которой параметр предоставляется реквизитом с установленным свойством Сохраняемые данные, для нового и несохраненного объекта приведет к попытке записать объект. При этом пользователю будет задан вопрос о необходимости записи. Если ответ будет отрицательный – команда не будет выполнена.

Примечание. При автоматическом заполнении командных панелей и контекстных меню, для которых указан источник команд, стандартные команды не добавляются, если в данном элементе есть кнопки, добавленные вручную с такими же командами. Данная логика не распространяется на команды, добавляемые из фрагмента глобального командного интерфейса.

Для упрощения разработки различных диалогов в стандартные команды формы добавлены команды Да, Нет, ОК, Отмена, Повторить, Прервать, Игнорировать. Если такая команда добавлена в форму, то при нажатии пользователем этой кнопки будут выполнены следующие действия:

● Для формы, открытой в модальном режиме, выполняется закрытие формы и возвращается соответствующее значение типа КодВозвратаДиалога.

● Для формы, открытой в немодальном режиме, выполняется только закрытие формы.

При формировании имени обработчика выполнения команды будет использоваться свойство команды Имя.

Стандартная команда формы Справка служит для открытия справочной информации по форме/объекту конфигурации. Расположение этой кнопки на командной панели формы определяется свойством ТолькоВоВсехДействиях этой кнопки. Если данное свойство установлено в значение Авто (и для командной панели с автоматическим заполнением), то фактическое расположение будет следующим:

● Интерфейс Такси – если у формы или родительского объекта конфигурации имеется справочная информация, то кнопка будет располагаться на командной панели. В противном случае кнопка будет располагаться только в меню Еще.

● Другие интерфейсы – кнопка всегда располагается на командной панели формы.

Использование – подробнее см. здесь.

Функциональные опции – определяет, с какими функциональными опциями связан данный реквизит формы. Подробнее про функциональные опции см. здесь.

7.5.2. Особенности применения различных команд

Для расширений управляемой формы для объекта, справочника, документа, плана видов характеристик, бизнес-процесса, задачи и записи регистра сведений существует стандартная команда Показать в списке, которая предназначена для отображения формы списка соответствующего объекта с позиционированием открываемого списка на объекте, из которого выполняется команда. В интерфейсе команда будет недоступна, если ключевой реквизит формы равен пустой ссылке (или пустому ключу записи), т. е. редактируется новый объект.

Если команда используется в форме документа, то для такой команды доступно свойство Параметр, в котором можно выбрать форму, которая будет использоваться для отображения списка. Для выбора доступен собственно документ и все журналы, в состав которых входит используемый документ. Кнопка, связанная с командой ПоказатьВСписке, отображается на форме вне зависимости от заполненности свойства Параметр. Если значение свойства Параметр задано, то в качестве заголовка по умолчанию у кнопки, связанной с командой ПоказатьВСписке, используется представление списка соответствующего объекта конфигурации (документа или журнала).

При автоматическом заполнении командной панели формы документа анализируются журналы, в которые входит документ, при этом на эти журналы текущий пользователь должен иметь право Просмотр (см. здесь) и они (журналы) должны быть включены функциональным опциям (см. здесь). Если есть хотя бы один такой журнал, то в командной панели вместо кнопки Показать в списке размещается группа кнопок с заголовком Показать в списке. Подменю содержит:

● Команду ПоказатьВСписке, для которой свойство Параметр заполняется ссылкой на документ, в форме которого формируется командная панель;

● Команды ПоказатьВСписке (по одной на каждый подходящий журнал), для которых свойство Параметр заполняется ссылкой на соответствующий журнал документов.

Если нет доступных журналов, то в командной панели размещается команда ПоказатьВСписке, у кнопки которой свойство Параметр не задано.

Для отображения используется основная форма списка (с учетом возможности переопределения, подробнее см. здесь) соответствующего объекта конфигурации.

Если необходимо обеспечить функциональность команды ПоказатьВСписке в рамках реализации какого-то другого алгоритма, то для этого следует использовать метод ВыполнитьПереход(), существующий для объекта УправляемаяФорма.

Пример реализации:

Копировать в буфер обмена
Форма = ПолучитьФорму("Справочник.Контрагенты.ФормаСписка");
Форма.ВыполнитьПереход(Объект.Ссылка);

Если необходимо каким-то образом обработать открытие формы с позиционированием на нужном объекте, то это можно сделать с помощью обработчика события ОбработкаПерехода (событие вызывается для управляемой формы). Если после исполнения обработчик события ОбработкаПерехода требуется выполнить стандартные действия (значение параметра СтандартнаяОбработка равна значению Истина), то у первой таблицы управляемой формы, связанной с основным реквизитом формы типа ДинамическийСписок (см. здесь) текущая строка устанавливается в значение, переданное в качестве параметра Объект обработчика события. Если основным реквизитом открываемой формы выступает не динамический список – никаких действий выполнено не будет.

7.6. Модуль формы

Модуль формы состоит из набора процедур и функций. Допускаются переменные и тело модуля.

Каждая процедура, функция или объявление переменной модуля формы должны предваряться одной из следующих директив компиляции:

НаКлиенте – означает, что метод выполняется на стороне клиента, а переменная существует все время жизни клиентской части формы.

Из клиентского метода допустимыми являются вызовы любых методов.

НаСервере – означает, что метод выполняется на стороне сервера, а переменная существует только во время вызова выполнения серверного вызова.

Для серверных методов допустимыми являются вызовы серверных, серверных внеконтекстных и клиент-серверных внеконтекстных методов.

НаСервереБезКонтекста – означает, что метод исполняется на сервере вне контекста формы. Переменные не могут предваряться такой директивой компиляции.

В таких методах недоступен контекст формы. При вызове этих методов не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных методов позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры из среды клиентского приложения.

Из серверных внеконтекстных методов формы допускается вызов серверных методов общих модулей.

НаКлиентеНаСервереБезКонтекста – означает, что метод исполняется как на клиенте, так и на сервере, вне контекста формы. Переменные не могут предваряться такой директивой компиляции.

Также такой метод не имеет доступа к переменным модуля формы.

Из клиент-серверного внеконтекстного метода можно вызывать методы неглобальных серверных общих модулей, а также методы неглобальных общих модулей с флажками Сервер и Клиент (управляемое приложение).

Отсутствие директивы компиляции перед процедурой означает использование директивы по умолчанию. Директивой по умолчанию является НаСервере.

При передаче управления с клиента на сервер с помощью контекстного вызова нужно учитывать следующую особенность: перед началом вызова данные формы передаются на сторону сервера, затем происходит выполнение серверного вызова, и потом данные формы передаются обратно на клиента. Это может занимать достаточно существенное время. В то же время внеконтекстный серверный вызов не выполняет таких преобразований, поэтому выполняется быстрее.

В программном модуле формы (т. е. фрагменте кода, размещенном вне процедур и функций) допустимо использование инструкций препроцессора для явного выделения участков кода инициализации соответствующих переменных.

ВНИМАНИЕ! В серверной переменной формы невозможно сохранить данные между двумя вызовами серверной стороны формы.

Не допускается использование нескольких директив компиляции перед одним методом или переменной. Не допускается наличие одноименных методов или переменных, отличающихся только директивами компиляции.

Обработчики команд формы, созданных разработчиком, могут располагаться только в клиентских методах модуля формы.

В модуле формы рекомендуется использовать директивы препроцессора только внутри процедур и функций.

Примечание. Для понимания результата при «пересечении» инструкциями препроцессора границ процедур следует учитывать, что обработка инструкций препроцессора выполняется до обработки директив компиляции.

Полный перечень директив компиляции и инструкций препроцессора см. здесь.

Приведем пример использования директив компиляции:

Копировать в буфер обмена
&НаСервере
Перем СервернаяПеременная;
&НаКлиенте
Перем КлиентскаяПеременная;
&НаСервере
Процедура Серверная()
    Сообщить(СервернаяПеременная);
КонецПроцедуры
&НаКлиенте
Процедура Команда1Выполнить()
    Сообщить(КлиентскаяПеременная);
    Серверная();
КонецПроцедуры
#Если Сервер Тогда
    СервернаяПеременная = "Сервер";
#КонецЕсли
#Если НаКлиенте Тогда
    КлиентскаяПеременная = "Клиент";
#КонецЕсли

7.7. Элементы формы

7.7.1. Общая информация

Визуальное представление управляемой формы описывается набором элементов. Элементы формы образуют иерархическую коллекцию. Иерархия элементов формы определяет внешний вид и состав отображаемых на форме элементов управления. Существует несколько типов элементов формы:

● форма – корневой элемент дерева элементов (см. здесь), существует в единственном экземпляре;

● поле формы (см. здесь);

● декорация формы (см. здесь);

● таблица формы (см. здесь);

● кнопка формы (см. здесь);

● группа формы (см. здесь);

● дополнение элемента формы (см. здесь).

Элементы формы типа поле формы и таблица формы всегда связаны с данными формы. Если связанный реквизит не указан, или он недоступен на клиенте ввиду ограничения по правам, или исключен из состава (свойства Просмотр и Редактирование реквизитов формы), поля не будет видно на форме, и оно будет автоматически удалено при создании формы в режиме исполнения.

Каждый элемент формы описывается некоторым набором свойств, которые определяют его поведение на форме, включая особенности отображения и трансформации – изменения размеров элемента при изменении размеров формы или окружающих элементов (включая исчезновение или появление элементов).

7.7.2. Общие свойства элементов формы

Данный раздел описывает общие свойства элементов формы. Свойства, специфичные для конкретных элементов, будут описаны ниже.

7.7.2.1. Группа свойств «Основные»

Свойство Положение заголовка определяет, каким образом будет выводиться заголовок элемента. Заголовком выступает синоним реквизита формы, связанного с выбранным элементом формы, если не указано свойство Заголовок у элемента формы. Заголовок всегда оканчивается символом ":" (добавляется системой автоматически). Заголовки элементов и групп могут динамически переноситься (с автоматическим увеличением высоты формы) при выполнении всех следующих условий:

● Заголовок состоит из нескольких слов, разделенных пробелами.

● Элемент с заголовком не является:

● Любым элементом, подчиненным таблице управляемой формы;

● Меню, кнопкой (вида Обычная кнопка или Кнопка командной панели);

● Заголовком страницы;

● Заголовком группы, если заголовок содержит дополнительные элементы оформления (оформление групп в интерфейсе версии 8.2).

Если в заголовке группы отображаются данные, и вышеуказанные условия выполнены, то перенос текста будет выполняться, но минимальная ширина текста не может быть меньше размера, отведенного для отображения данных заголовка.

При добавлении элемента в свойстве Данные необходимо указать ссылку на реквизит формы, с которым этот элемент связан. Если элемент формы не связан с реквизитом формы, то он не будет отображен на форме. Если на форму добавляется кнопка, то в свойстве Команда необходимо указать ссылку на команду, которая будет выполняться при нажатии кнопки. Если кнопка не связана с командой, то она не будет отображена на форме.

Элемент формы может находиться в режиме Только просмотр (запрещающем любые изменения), если у него установлено свойство Только просмотр (в конфигураторе или с помощью встроенного языка), или у группы, в которую он входит, установлено свойство Только просмотр, или связанный с ним реквизит формы имеет признак Сохраняемые данные и у формы установлен режим Только просмотр.

Для управления видимостью элементов формы существуют два свойства: Видимость и Пользовательская видимость. Первое свойство можно изменять как в редакторе формы (в конфигураторе), так и программно. Свойство Пользовательская видимость настраивается только в конфигураторе и задает начальную видимость элемента формы в разрезе ролей. Результирующая видимость элемента формы образуется сложением «по И» свойств Видимость и Пользовательская видимость для конкретного пользователя. Описание редактирования свойства Пользовательская видимость см. здесь. Кроме того, изменяя видимость элементов формы в диалоге Настройка формы, пользователь фактически выполняет изменение свойства Пользовательская видимость конкретного элемента формы.

Описание свойств Высота и Ширина (или Количество строк) см. здесь.

С помощью свойства Пропускать при вводе можно задать пропуск элемента формы при обходе формы с помощью клавиши Enter. Если свойство установлено в значение Да, то элемент будет пропущен при обходе по Enter (но доступен при обходе с помощью клавиши Tab или указания элемента мышью). Если свойство установлено в значение Нет, то элемент не будет пропущен при обходе с помощью клавиши Enter. Также существует возможность указать автоматическое определение необходимости пропуска элемента формы. Для этого необходимо установить значение этого свойства равным Авто. В этом случае будет использоваться следующий алгоритм работы:

● Элемент типа Поле будет пропускаться в случае поля вида, поля надписи или поля картинки, а также в зависимости от значения свойства Отображение предупреждения при редактировании (см. здесь).

● Элемент типа Кнопка не будет пропускаться в том случае, если кнопка является кнопкой по умолчанию.

● Элемент типа Декорация будет пропускаться.

● Элемент типа Таблица не будет пропускаться.

7.7.2.2. Связь элементов с реквизитами формы

7.7.2.2.1. Общая информация

Любой элемент, отображающий какие-либо данные, должен быть связан с реквизитом формы. Можно выделить «обычную» связь – когда элемент формы отображает данные какого-либо реквизита формы, и «специальные» режимы связи.

7.7.2.2.2. Связь с обычным реквизитом формы

В простейшем случае элемент формы отображает значение, сохраненное в каком-либо реквизите формы. В зависимости от типа реквизита, система автоматически определяет, какой элемент формы будет использоваться для отображения данных, и какого вида будет этот элемент (если такое возможно).

В этом случае свойство Путь к данным содержит имя реквизита формы, чьи данные будут отображены этим элементом.

7.7.2.2.3. Связь с текущими данными таблиц

Элемент формы может быть связан с реквизитом, представляющим собой колонку таблицы, размещенной на форме. При этом в данном элементе отображаются данные поля текущей строки таблицы. Такая связь допускается как для полей, так и для таблиц, при этом не требуется, чтобы в таблице отображалась соответствующая колонка. Элемент, связанный с текущими данными, может находиться как в режиме Только просмотр, так и в режиме редактирования.

Например, необходимо расположить на форме поле, которое отображает цену для текущей строки товара. Для этого в нужное место иерархии элементов формы добавляем поле (вид поля ввода может быть как Поле надписи, так и Поле ввода), для которого в качестве данных выбираем (в диалоге Выбор реквизита) Объект.Товары.Цена. Здесь Объект – это реквизит формы типа Документ конкретного вида, Товары – это табличная часть документа, а Цена – реквизит табличной части.

7.7.2.2.4. Связь с определенной строкой таблицы

Элемент формы может быть связан с реквизитом, представляющим собой колонку указанной строки таблицы, являющейся реквизитом формы. Такая связь допускается как для полей, так и для таблиц, при этом не требуется, чтобы в таблице отображалась соответствующая колонка. Конкретная строка задается индексом строки (например, ТаблицаЗначений[1]) или последовательностью индексов для иерархических таблиц (например, ТаблицаЗначений[2].СписокИтогов[4]). Элемент, связанный с текущими данными, может находиться как в режиме Только просмотр, так и в режиме редактирования.

Примечание. Данная связь не поддерживается для динамических списков.

Например, необходимо расположить на форме поле, которое отображает значение поля Долг из 4-й строки таблицы значений Контрагенты. Для этого в нужное место иерархии элементов формы добавляем поле (вид поля ввода может быть как Поле надписи, так и Поле ввода), для которого в качестве данных выбираем (в диалоге Выбор реквизита) Контрагенты[3].Долг. Здесь Контрагенты – это реквизит формы типа (ТаблицаЗначений), а Долг – колонка таблицы значений.

Если данные поля ссылаются на отсутствующую строку – редактировать такое поле будет нельзя, даже если выбрано поле ввода, в противном случае изменение, выполненное в поле ввода, будет выполнено и в таблице, на которую ссылается поле ввода.

В примере выше, если пользователь изменит поле ввода, значение из этого поля попадет в колонку Долг 4-й строки таблицы значений Контрагенты.

7.7.2.2.5. Связь с реквизитами через ссылку

Если в данных формы есть реквизиты ссылочных типов (например, СправочникСсылка), то элемент формы можно связать с реквизитом, полученным по этой ссылке. Данные для таких элементов будут получаться автоматически и обновляться при изменении ссылки. Связь с реквизитами через ссылку может быть любой глубины. Элементы, связанные с такими реквизитами, всегда находятся в режиме Только просмотр.

Примечание. Для реквизитов составного типа (включая типы СправочникСсылка, ДокументСсылка и т. д.) недоступно получение реквизитов через ссылку.

Например, нужно расположить на форме поле, которое отображает артикул текущей строки товара. Для этого нам необходимо добавить в нужное место иерархии элементов формы поле с видом Поле надписи, для которого в качестве данных выбрать (в диалоге Выбор реквизита) Объект.Товары.Товар.Артикул. Здесь Объект – это реквизит формы типа Документ конкретного вида, Товары – это табличная часть документа, Товар – это реквизит табличной части, а Артикул – реквизит справочника Товары.

7.7.2.2.6. Связь с итогами коллекций

Элемент формы может быть связан с реквизитами, представляющим собой итоговые значения некоторых коллекций: табличные части, наборы записей, список значений (только количество строк в коллекции). Такими реквизитами могут быть:

● итоги по числовым полям,

● количество строк в коллекции.

Элементы, связанные с такими реквизитами, всегда находятся в режиме Только просмотр.

В качестве примера поместим на форму поле, отображающее суммовой итог для табличной части Товары. Для этого в качестве данных поля формы укажем Объект.Товары.ИтогСумма, где Объект – это основной реквизит формы, Товары – табличная часть документа, а ИтогСумма – специальный реквизит. Связь может быть установлена не только для самого элемента. Также поддерживается установка связи для отображения данных в подвале таблицы и в заголовке закладки (группы вида Страница).

В зависимости от типа данных, которые отображает элемент формы (поле ввода, кнопка и группа), с помощью свойства Вид можно задать способ отображения данных.

7.7.2.3. Группа свойств «Использование»

Подробнее про использование свойства Быстрый выбор см. здесь.

Описание свойства Связи параметров выбора см. здесь. Описание свойства Параметры выбора см. здесь. Если значения свойств Связи параметров выбора и Параметры выбора заданы и в свойствах реквизита объекта метаданных, и в свойствах элемента формы, то значения свойства будут объединены. Объединение будет выполняться «по ИЛИ» (по именам параметров).

Имеется возможность указывать расширенную подсказку для следующих элементов формы:

● Поле;

● Таблица;

● Группа;

● Кнопка;

● Декорация.

Расширенная подсказка задается с помощью свойства Расширенная подсказка соответствующего элемента формы. Включается возможность указания данной подсказки с помощью команды Показать расширенную подсказку контекстного меню элемента формы. При этом сама расширенная подсказка представляет собой декорацию формы типа Текст. Текст расширенной подсказки задается с помощью свойства декорации Заголовок. При это имеется возможность управлять некоторыми параметрами отображения подсказки с помощью свойств раздела Оформление у декорации. Если требуется специальным образом оформлять сам текст подсказки, то для этого необходимо выбрать в окне редактирования расширенной подсказки значение переключателя Форматированная строка. При этом будут доступны расширенные возможности оформления (подобные форматированному документу). Также у вышеперечисленных элементов формы можно задать отображение подсказки: вокруг элемента формы, кнопкой рядом с элементом формы, всплывающим окном или отображение будет выбираться автоматически. Если задан режим отображения подсказки Кнопка, то отображаться будет свойство Заголовок расширенной подсказки с форматированием. Если задан режим отображения Всплывающий, то будет отображаться свойство Заголовок расширенной подсказки, но в виде обычной строки (с убранным форматированием).

Если заданы одновременно свойства Подсказка и свойство Заголовок расширенной подсказки – отображаться будет текст из расширенной подсказки.

7.7.2.4. Группа свойств «События»

В данной группе собраны ссылки на обработчики, которые предоставляет тот или иной элемент формы.

Следует понимать, что вызов какого-либо обработчика события (не обязательно события элемента формы) из кода на встроенном языке не является аналогом вызова этого же обработчика самой платформой, в рамках выполнения последовательности событий, связанных с тем или иным действием пользователя. Так, например, программный вызов обработчика события ПриЗаписиНаСервере() модуля формы справочника не означает, что будет открыта транзакция и произойдет запись элемента справочника. При таком вызове будет исполнен только код обработчика, причем, возможно, что код будет исполнен некорректно или в процессе исполнения этого кода возникнут ошибки. Ошибки могут возникнуть потому, что разработчик, который создавал этот обработчик, исходил из того, что этот обработчик будет вызван только самой платформой и при этом платформа же обеспечит некоторое окружение.

7.7.2.5. Картинки элементов

Элементы формы позволяют использовать для своего оформления картинки. Задание картинки возможно двумя способами:

● из конфигуратора,

● программным способом.

В случае если картинка задается программным способом, может быть установлена либо пустая картинка, либо картинка из библиотеки картинок конфигурации.

Если картинка задается из конфигуратора, то возможен еще один вариант – задание картинки из файла на диске (внешняя картинка). Использование таких картинок рекомендуется только в тех случаях, когда разрабатываются внешние отчеты или обработки, которые могут использоваться в различных конфигурациях, и картинка является значимым элементом оформления. В остальных случаях использование таких картинок является нежелательным. Для команд формы и глобальных команд выбрать внешнюю картинку невозможно.

7.7.3. Форма

Описывает визуальные свойства формы. Элемент такого типа всегда существует в единственном числе и находится в корне иерархии элементов. Также в свойствах формы описываются обработчики событий формы.

Режим открытия формы управляется специальным свойством – Режим открытия окна. Данное свойство описывает, каким образом будет открыто окно:

Независимый – форма открывается:

● Режим Формы в отдельных окнах. Форма открывается в немодальном окне, которое является вспомогательным окном приложения.

● Режим Формы в закладках. Форма открывается в отдельной закладке.

● Режим Такси. Форма открывается в рабочей области основного окна приложения.

Блокировать окно владельца – форма открывается в немодальном окне, в режиме, когда работа с формой, из которой инициировано открытие текущей формы, блокируется. Данный режим предназначен для форм, в которых вводится мало информации и работа с которыми не требует длительного времени, например, для ввода элементов справочников, содержащих небольшое количество реквизитов. Этот режим внешне аналогичен модальному открытию формы, однако при открытии из встроенного языка работа модуля не останавливается на время работы открываемой формы. При этом все остальное взаимодействие с формой выполняется как с другими немодальными формами. Такая форма также открывается во вспомогательном окне.

Форма, открытая в таком режиме, не участвует в поиске уже открытых форм. Если попытаться открыть точно такую же форму (даже с параметром уникальности, установленным в значение Ложь), то форма, открытая в режиме Блокировать окно владельца, не будет найдена и будет открыта новая форма.

Этот режим по умолчанию установлен у следующих форм:

● элемент и группа справочника,

● узел плана обмена,

● элемент и группа плана видов характеристик,

● счет,

● вид расчета,

● задача,

● запись независимого регистра сведений.

Блокировать весь интерфейс – аналогично форме, которая открывается в режиме Блокировать окно владельца, но блокируется работа не только с родительской формой, но со всем интерфейсом прикладного решения. Такой режим открытия не используется в качестве установки «по умолчанию».

При открытии формы в блокирующем режиме используется следующий алгоритм определения блокируемого окна:

● Если в свойстве ВладелецФормы задана форма и эта форма не закрыта, блокируется окно этой формы.

● Если в свойстве ВладелецФормы задан элемент формы, и эта форма не закрыта, то блокируется окно формы, которой принадлежит этот элемент.

● В остальных случаях, если в свойстве ВладелецФормы задано значение Неопределено или форма владельца закрыта, блокируется окно, которое является текущим окном клиентского приложения на момент открытия формы.

Свойство Режим открытия окна не оказывает влияния на открытие формы, если она открывается в модальном режиме, а также при открытии в уже существующем основном или вспомогательном окне.

Описание правила формирования автоматического заголовка см. здесь.

Свойство формы Вертикальная прокрутка определяет расположение элементов формы при начальном отображении, а также то, как будут вести себя элементы формы в том случае, если форма будет сжиматься по вертикали:

● Значение Использовать – полоса вертикальной прокрутки появится после того, как вертикальный размер элементов формы достигнет размера, который был задан при редактировании формы в конфигураторе (это относится и к элементам с автоматически определением высоты элемента).

● Значение ИспользоватьБезРастягивания – при растягивании формы элементы формы не реагируют на изменение размера формы.

● Значение ИспользоватьПриНеобходимости – перед появлением полосы прокрутки элементы формы будут сжиматься по вертикали до своего минимального размера.

Рассмотрим пример: имеется форма с реквизитом Список типа ДинамическийСписок. Этот реквизит отображается на форме таблицей Список, для которой высота указана в 8 строк таблицы. Если свойство формы Вертикальная прокрутка установить в значение Использовать, то форма практически не будет сжиматься:

Рис. 258. Вертикальная прокрутка формы – использовать

В этом случае полоса вертикальной прокрутки появилась сразу, как только форму попытались сжать по вертикали.

Если свойство формы Вертикальная прокрутка установить в значение ИспользоватьПриНеобходимости, то форма вначале максимально уменьшит свой размер по вертикали, и лишь потом появится вертикальная полоса прокрутки:

Рис. 259. Вертикальная прокрутка формы – использовать при необходимости

При установке свойства в значение Авто, поведение формы определяется системой на основании типа основного реквизита формы:

● Если основной реквизит формы имеет тип ДинамическийСписок, или основной реквизит формы имеет тип ОтчетОбъект, и для расширения формы отчета заполнено свойство РезультатОтчета, то значение Авто трактуется как значение ИспользоватьПриНеобходимости;

● В остальных случаях значение Авто трактуется как Использовать.

Свойство Вариант масштаба определяет, каким образом управляемая форма будет отображаться в интерфейсе Такси:

Авто – система автоматически определяет режим отображения формы. В этом случае анализируется свойство ВариантМасштабаФормКлиентскогоПриложения объекта НастройкиКлиентскогоПриложения. Если в данном свойстве не указано конкретное значение варианта масштаба, то в интерфейсе Такси значение Авто будет трактоваться как Обычный.

Обычный – форма выглядит стандартно для интерфейса Такси;

Рис. 260. Обычный вариант масштаба

Компактный – в этом случае форма выглядит «почти» как в интерфейсе версии 8.2.

Рис. 261. Компактный вариант масштаба

С технической точки зрения, форма, для которой значение свойства Вариант масштаба установлено в значение Компактный, имеет следующие особенности:

● В качестве шрифта формы используется системный шрифт Шрифт диалогов и меню;

● Элементы формы имеют размеры, максимально соответствующие таковым в интерфейсе версии 8.2;

● Расстояния между элементами формы максимально соответствуют расстояниям в интерфейсе версии 8.2;

● Табличный документ, диаграмма, диаграмма Ганта, дендрограмма, графическая схема и географическая схема отображаются без увеличения масштаба.

Данное свойство предназначено для того, чтобы упростить использование сложных (насыщенных) форм в интерфейсе Такси без переработки этих форм. Данная возможность не является основной, т. к. получающийся в результате интерфейс не вполне соответствует интерфейсу Такси.

Также можно управлять масштабом сразу всех форм прикладного решения. Для этого следует соответствующим образом установить значение свойства ВариантМасштабаФормКлиентскогоПриложения объекта НастройкиКлиентскогоПриложения. Значение этого свойства будет использоваться для всех форм, у которых значение свойства Вариант масштаба установлено в значение Авто.

При отображении на форме одновременно списка групп и собственно содержимого справочника, возникает задача синхронизации этих списков, чтобы при выборе группы в списке групп, в списке элементов отображалось содержимое выбранной группы. Для облегчения этой синхронизации предназначено свойство расширения формы для динамического списка Список групп. Это свойство становится доступным в том случае, если основным реквизитом формы выступает реквизит типа ДинамическийСписок. В свойстве Список групп, в этом случае, следует указать таблицу управляемой формы, отображающей динамический список, который отображает только иерархию групп отображаемого справочника. В этом случае система обеспечивает автоматическую синхронизацию списков при навигации по любому из них.

Рис. 262. Список групп

Для формы можно отобразить командную панель (ее расположением на форме можно управлять с помощью свойства Положение командной панели). Состав стандартных команд формы можно регулировать через свойство формы Состав команд.

Если свойство Разрешить изменять форму снято, то пользователь не может изменить состав и относительное положение элементов формы в режиме 1С:Предприятие.

Свойство Проверять заполнение автоматически отвечает за проверку заполнения данных формы. Подробнее о проверке заполнения см. здесь.

Если свойство формы Сохранение данных формы в настройках установлено в значение Использовать список, то в списке реквизитов становится доступной колонка Сохранение. Значения реквизиты, у которых свойство Сохранение установлено в значение Истина, будут сохраняться в хранилище данных формы (подробнее см. здесь). Для сохранения будет использовано либо хранилище, указанное в свойстве формы Хранилище настроек, либо хранилище, указанное в свойстве Хранилище настроек данных форм конфигурации.

Примечание. Недоступно указание флажка Сохранение для табличных частей объектов.

Для установки режима Только просмотр у формы существует свойство ТолькоПросмотр, доступное только для программного изменения. В случае установки этого свойства в состояние Истина следующие стандартные команды станут недоступны (в том числе и при попытке использовать для вызова этих команд сочетания клавиш):

● Для всех форм:

Восстановить параметры.

● Для табличного поля:

Добавить,

Скопировать,

Удалить.

● Для расширения формы объекта, записи регистра сведений, константы:

Записать,

Записать и закрыть,

Провести,

Провести и закрыть,

Отменить проведение,

Старт,

Выполнено.

● Для расширения формы выбора/настроек:

Завершить редактирование,

Выбрать настройки.

● Для расширения табличного поля для динамического списка:

Пометить на удаление,

Провести,

Отменить проведение,

Создать группу,

Переместить в группу.

● Для расширения табличного поля для списка значений:

Изменить,

Переместить вверх,

Переместить вниз,

Сортировать по убыванию,

Сортировать по возрастанию,

Подбор.

● Все команды изменения следующих коллекций системы компоновки данных:

● коллекций настроек,

● коллекций доступных полей.

● Для расширения табличного поля для ДанныеФормыКоллекция, ДанныеФормыДерево, ДанныеФормыСтруктураИКоллекция:

Изменить,

Переместить вверх,

Переместить вниз,

Сортировать по убыванию,

Сортировать по возрастанию.

Также будут недоступны элементы формы, связанные с этими командами.

Если для формы установлено свойство Только просмотр и основным реквизитом формы является динамический список, то все таблицы, связанные с этим списком, также перейдут в режим просмотра. Кроме того, если заполнено свойство Список групп, то элемент формы, указанный в этом свойстве, также перейдет в режим просмотра. При этом свойство элементов формы Только просмотр не будет изменено.

7.7.4. Поле

7.7.4.1. Общая информация

Элемент формы Поле предназначен для отображения и редактирования какого-либо реквизита формы. Поле формы может быть нескольких видов:

● поле ввода,

● поле надписи,

● поле флажка,

● поле картинки,

● поле переключателя,

● поле текстового документа,

● поле табличного документа,

● поле календаря,

● поле индикатора,

● поле полосы регулирования,

● поле диаграммы,

● поле диаграммы Ганта,

● поле дендрограммы,

● поле графической схемы,

● поле географической схемы,

● поле HTML-документа,

● поле форматированного документа;

● поле планировщика.

Если поле является подчиненным элементом для элемента формы Таблица, то оно может принимать следующие типы:

● поле ввода,

● поле картинки,

● поле надписи,

● поле флажка.

Для того чтобы разместить на форме поле ввода с видами: поле табличного документа, поле диаграммы (см. здесь), поле диаграммы Ганта (см. здесь), поле дендрограммы (см. здесь), поле графической схемы, поле географической схемы, необходимо создать реквизит формы соответствующего типа и указать этот реквизит в качестве данных элемента формы.

Для того чтобы разместить на форме поле HTML-документа, необходимо создать реквизит формы типа Строка, затем создать поле ввода вида Поле HTML документа и указать созданный реквизит в качестве данных для этого поля. В качестве значения реквизита формы может выступать навигационная ссылка или текст HTML-документа.

Примечание. Следует учитывать, что при использовании поля HTML-документа может не обеспечиваться поддержка всей функциональности HTML. В частности, не поддерживаются скрипты с состоянием (переменные, хранящие значения, необходимые в различных обработчиках событий), работа с языком разметки SVG, свойство HTML-документа parentWindow. Ограничения могут быть обусловлены специфическими особенностями функционирования HTML (в том числе и неидентичное функционирование) в формах «1С:Предприятия» в клиентских приложениях и в различных веб-браузерах.

Чтобы разместить на форме поле форматированного документа, необходимо создать реквизит формы типа ФорматированныйДокумент, затем создать поле ввода вида Поле форматированного документа и указать созданный реквизит в качестве данных для этого поля. Подробнее про форматированный документ см. здесь.

Свойство поля ввода Подсказка ввода позволяет указывать подсказку, которая будет формироваться непосредственно «внутри» поля ввода, если выполняются следующие условия:

● Тип связанного реквизита не является типом Число или Дата.

● Значение связанного реквизита не содержит значение по умолчанию для данного типа.

7.7.4.2. Обновление отображаемых данных

При работе с полем ввода следует помнить об особенности, связанной с изменением данных формы или ее (формы) структуры во время работы с данными поля ввода. Особенность заключается в нежелательном обновлении данных в поле ввода, которое происходит при выполнении следующих условий:

● В поле ввода находятся данные, которые не зафиксированы в реквизите формы, связанного с полем ввода. Например, при вводе текста.

● В это время срабатывает обработчик ожидания или внешнего события.

● В обработчике события изменяются данные формы или состав элементов формы.

В описанном случае текст, отображаемый полем ввода, будет заменен представлением тех данных, которые получены в данных формы после завершения контекстного вызова. Изменить такое поведение можно несколькими способами.

Свойство ОбновлениеТекстаРедактирования

Если в вышеописанной ситуации необходимо заблокировать изменение только одного (или небольшого количества) поля ввода, то такую блокировку можно установить с помощью свойства поля ввода ОбновлениеТекстаРедактирования. Если установить это свойство в значение ПриИзмененииЗначения, то содержимое поля ввода будет обновляться только в том случае, когда в связанный реквизит формы будет помещено значение, отличающееся от текущего значения реквизита. Если свойство ОбновлениеТекстаРедактирования поля ввода установить в значение Никогда, то текст в поле ввода не будет изменяться даже при изменении значения связанного реквизита.

Метод ОбновитьОтображениеДанных()

Если в вышеописанной ситуации присутствует обратная ситуация: требуется обновить только ограниченное количество полей, а остальные поля оставить без изменения, то для обновления можно использовать метод ОбновитьОтображениеДанных(), указав в качестве параметра метода список полей формы, которые следует обновить. Если параметр задан, то установка значений и обновление отображаемой информации будет выполняться только для указанного поля (или списка полей). Если в качестве параметра передан пустой массив, то установка значений не будет выполняться для всех элементов управляемой формы.

Параметрами метода могут выступать только следующие элементы формы: ГруппаФормы, ТаблицаФормы, ПолеФормы.

Использование метода ОбновитьОтображениеДанных() имеет смысл только в следующих случаях:

● из обработчика внешнего события;

● обработчика ожидания формы;

● обработчика оповещения.

В обработчиках других событий поведение не изменяется: будут установлены значения (и, как следствие, обновлено отображение данных) для всех элементов управляемой формы (в веб-клиенте – только те значения, которые отличаются от текущих данных формы).

В качестве примера использования такого способа обновления данных можно привести следующий вариант использования: в поле ввода вводится данные, идентифицирующие контрагента. В обработчике ожидания выполняется проверка данных этого контрагента, и изменяются некоторые элементы формы, отображающие результат проверки. В этом случае рекомендуется в обработчике ожидания использовать метод ОбновитьОтображениеДанных() указав в качестве списка параметров элементы, связанные с результатами проверки. Остальные элементы формы обновлены не будут. Также следует помнить, что вызов контекстного серверного вызова, изменяющего данные формы, в обработчике ожидания однозначно приведет к изменению всех данных формы, кроме элементов с измененным значением свойства ОбновлениеТекстаРедактирования.

7.7.4.3. Предупреждение при редактировании

Если в поле ввода формы редактируется реквизит, который заполняется автоматически, но, тем не менее, может заполняться вручную (в крайне редких случаях), то такое поведение можно реализовать с помощью свойств поля ввода Отображение предупреждения при редактировании и Предупреждение при редактировании. Если значение свойства Отображение предупреждения при редактировании равно Отображать, то при попытке начать редактирование поля «1С:Предприятие» выдаст предупреждение, которое состоит либо из строки, указанной в свойстве Предупреждение при редактировании, либо формируется автоматически.

Для стандартных полей Код и Номер (для объектов с автоматической нумерацией) автоматическая строка предупреждения будет выглядеть как Номер заполняется при записи автоматически, а для остальных полей автоматическая строка будет выглядеть как Редактирование поля "Имя поля" не рекомендуется. Если значение свойства Отображение предупреждения при редактировании равно Авто, то для стандартных реквизитов Код и Номер будет использоваться значение Отображать, а для остальных полей – Не отображать. Свойство Отображение предупреждения при редактировании также оказывает влияние на свойство поля ввода Пропускать при вводе. Если значение свойства Пропускать при вводе равно Авто, то поле будет пропускаться при вводе в том случае, если значение свойства Отображение предупреждения при редактировании равно Отображать (или Авто для стандартных полей Код и Номер).

7.7.4.4. Отметка незаполненного

Если свойство АвтоОтметкаНезаполненного поля ввода установлено в значение Истина, то свойство этого поля ОтметкаНезаполненного будет автоматически актуализироваться при передаче значения из реквизита в поле ввода.

7.7.4.5. Отображение переключателя и флажка

Если вставляется поле вида Поле переключателя, то для него необходимо задать свойство элемента формы Список выбора, который определяет количество и значения переключателей. По умолчанию используется горизонтальное расположение переключателей. Для того чтобы расположить их по вертикали, необходимо изменить значение свойства Количество колонок. В том случае, если количество колонок установлено в значение 0, то система может расположить элементы переключателя в несколько строк, подбирая количество элементов переключателя в строке, исходя из свободного места на форме. Подбор выполняется не динамически, а в момент создания формы.

Для полей вида Поле флажка и Поле переключателя существует возможность указывать вид отображения. Это делается с помощью свойства Вид флажка у соответствующего элемента формы. Для поля флажка можно выбрать представление в виде флажка или тумблера.

Рис. 263. Флажок или тумблер

На рис. 263 представлены различные варианты отображения поля флажка. В верхней части рисунка поле флажка представлено тумблером, а в нижней – флажком. Для поля переключателя можно выбрать представление в виде переключателя или тумблера.

Рис. 264. Переключатель или тумблер

На рис. 264 представлены различные варианты отображения поля переключателя. В верхней части рисунка поле переключателя представлено в виде тумблера, а в нижней – в виде переключателя.

7.7.4.6. Редактирование стандартных периодов и дат

Для реквизита формы типа СтандартныйПериод или СтандартнаяДатаНачала существуют два способа редактирования:

● С использованием одного поля формы. В этом случае можно разместить на форме поле, связанное непосредственно с редактируемым реквизитом. Тогда все редактирование будет выполняться именно в этом поле.

● С использованием нескольких полей. При этом можно разместить на форме поля, связанные со свойствами реквизита. В этом случае разработчик может сам реализовывать необходимую логику взаимодействия варианта стандартного периода и значений дат.

7.7.5. Декорация

Представляет собой оформительский элемент формы. Декорация не связана с данными (реквизитами формы). Декорация может представлять собой надпись или картинку.

Текст, отображаемый декорацией вида Текст, может динамически переноситься (при сжатии или растяжении формы) при одновременном выполнении следующих условий:

● Текст содержит несколько слов, разделенных пробелами;

● Значение свойства декорации Растягивать по горизонтали в явном виде не установлено в значение Нет;

● Значение свойство декорации Высота установлено в значение 0;

● Значение свойства декорации Растягивать по вертикали в явном виде не установлено в значение Нет.

Декорация вида Картинка будет автоматически определять свой размер (по ширине и высоте) по установленной картинке, если соответствующее свойство декорации (Ширина или Высота, соответственно) установлено в значение 0.

Совет. Рекомендуется использовать декорацию только для неизменяемых текстовых пояснений. Текст, который может изменяться из встроенного языка, рекомендуется отображать полем вида Поле надписи.

7.7.6. Таблица

Элемент формы Таблица предназначен для визуализации табличных данных. Это может быть динамический список, табличная часть, список значений и т. д.

Положение командной панели таблицы регулируется свойством Положение командной панели элемента формы. Состав стандартных команд, располагающихся в командной панели таблицы, регулируется с помощью свойства Состав команд. Команды, отключенные при редактировании данного свойства, становятся недоступными.

Имеется возможность группировать колонки с помощью элемента формы Группа. Подробнее об этом см. здесь.

Свойства ЦветРамки и Рамка, заданные для колонки таблицы, не оказывают влияния на отображение колонки.

Для реквизита формы типа СписокЗначений существует выбор, каким образом реквизит будет отображаться. Если выбирается вариант Таблица, то список значений будет выглядеть как таблица с доступными колонками: Значение, Представление, Пометка и Картинка. При этом следует помнить об особенности отображения значений в колонке Значение. В этой колонке будет отображено значение колонки Представление. Само значение при этом остается неизменным. Если будет выбран тип Поле ввода, то для редактирования списка будет открыто специальное окно.

Также для таблицы, связанной с реквизитом типа СписокЗначений, предоставляется стандартный набор команд редактирования, включая команды установки и снятия пометок.

Если таблица связана с реквизитом типа ДинамическийСписок, у которого в настройках списка (свойство реквизита формы Настройка списка) задана группировка, то список всегда будет отображаться в режиме Дерево (свойство элемента формы Отображение), вне зависимости от того, какой режим отображения задан разработчиком. Если для табличного поля, связанного с динамическим списком, установлено свойство Только просмотр, то при открытии из такого списка форм объектов им будет автоматически установлен параметр формы ТолькоПросмотр.

Также для таблицы, связанной с динамическим списком, имеется возможность управлять обновлением списка при изменении данных (в этом же клиентском приложении) с помощью свойства Обновление при изменении данных. Если свойство установлено в значение Авто, то список будет автоматически обновляться при любых изменениях отображаемых данных. Если свойство имеет значение Не обновлять, то список не будет выполнять автоматическое обновление и для обновления списка необходимо явно выполнить команду Обновить(). Если для динамического списка задано автоматическое обновление с указанным интервалом и свойство Обновление при изменении данных установлено в значение Авто, интервал отсчитывается от ближайшего изменения данных, а если в значение Не обновлять – от последнего вызова автоматического обновления или выполнения команды Обновить().

Для таблицы, связанной с основным реквизитом формы типа динамический список, имеется возможность управлять режимом множественного выбора с помощью соответствующего параметра формы. Значение параметра формы МножественныйВыбор будет установлено в одноименное свойство таблицы. При этом свойство Режим выделения будет установлено в значение Множественный, если параметр формы МножественныйВыбор имеет значение Истина.

При открытии формы выполняется чтение данных только для видимых таблиц, связанных с динамическими списками. Для таблиц, которые не видимы при открытии формы, чтение данных выполняется в момент их (таблиц) отображения пользователю. В частности, для невидимых таблиц, значение свойства ТекущаяСтрока будет равно Неопределено. Эту особенность следует учитывать при разработке логики формы.

Для динамического списка, находящегося в режиме выбора, при добавлении нового объекта будет выполнена проверка на соответствие добавляемого объекта установленным критериям отбора, и если новый объект удовлетворяет критериям отбора, на него будет установлен курсор в таблице, отображающей динамический список.

Если форма списка плана счетов или справочника с иерархией элементов открывается с установленными параметрами РазрешитьВыборКорня, равным Истина, и РежимВыбора, равным Истина, то для всех таблиц формы, связанных с основным реквизитом формы (типа ДинамическийСписок), будут автоматически изменены значения следующих свойств:

● свойство ОтображатьКорень будет установлено в значение Истина;

● свойство РазрешитьВыборКорня будет установлено в значение Истина;

● свойство Отображение будет установлено в значение Дерево.

Стандартная картинка строк формируется на основе стандартных полей таблиц, используемых для определения состояния элемента (ПометкаУдаления, Предопределенный и т. д.). Если в тексте запроса списка есть поля, псевдонимы которых совпадают с именами стандартных полей, но в них получаются другие данные – такие поля не будут использоваться для формирования стандартной картинки.

В случае необходимости подмены стандартной картинки, следует:

1. Добавить в библиотеку картинок требуемую коллекцию картинок;

2. Выбрать добавленную картинку в свойстве КартинкаСтрок таблицы, связанной с динамическим списком.

3. Добавить в текст запроса поле, имеющее значение индекса картинки.

Например:

Копировать в буфер обмена
ВЫБОР
    КОГДА Таблица.ПометкаУдаления ТОГДА 2
    КОГДА Таблица.Предопределенный ТОГДА 1
    ИНАЧЕ 0
КОНЕЦ КАК ИндексКартинки

4. Указать добавленное поле в свойстве ПутьКДаннымКартинкиСтроки таблицы, связанной с динамическим списком.

Картинка строк будет отображаться у первого (считая слева) видимого поля динамического списка вида поле ввода или поле надписи. Если в процессе редактирования состава колонок таблицы произойдет изменение порядка колонок, то картинка также будет отображаться у той колонки, которая стала крайней левой (с указанного выше вида). Однако если отключение видимости колонок выполняется с помощью условного оформления, то поведение системы становится несколько другим: если скрывается колонка, к которой привязана картинка (или символ иерархии), то картинка (или символ иерархии) в этой строке отображаться не будет.

Примечание. Если таблица отображает динамический список (см. здесь) и свойство Начальное отображение дерева установлено в значение Раскрывать все уровни, то при создании формы на сервере будет получен только список строк, отображаемых на первом уровне, а затем, при открытии формы, будут получены остальные отображаемые строки. Причем для каждой отображаемой группы будет выполнен отдельный запрос к серверу.

При разработке форм возникают ситуации, когда необходимо в таблице предотвратить прокрутку некоторых колонок. Например, в табличной части нужно зафиксировать колонки Номер, Номенклатура и Сумма. При этом колонки Номер и Номенклатура требуется прижать к левому краю таблицы, а Сумма – к правому.

Для выполнения такой операции предназначено свойство ФиксацияВТаблице. Данное свойство доступно у поля, размещенного в таблице, и у группы вида Группа колонок (см. здесь). В нашем примере необходимо для колонок Номер и Номенклатура установить свойство ФиксацияВТаблице в значение Лево, а для колонки Сумма – в значение Право. Колонки будут прижаты к соответствующему краю таблицы вне зависимости от того, где эти колонки были расположены в редакторе формы, однако зафиксированные колонки располагаются в том порядке, в котором они расположены в редакторе формы.

Если признак фиксации указан у группы, то прижата будет вся группа (вместе со всеми подчиненными элементами формы), при этом значение свойства ФиксацияВТаблице для подчиненных элементов игнорируется. Если признак фиксации указан у колонки, входящей в группу, для которой свойство ФиксацияВТаблице установлено в значение Нет, то колонка будет обрабатываться как отдельная колонка, не входящая в группу.

Если в вертикальной группе колонок в некоторой строке ширина колонок превышает ширину колонок из других строк, то в более узких строка строках последняя колонка группы растягивается до ширины максимально широкой строки. Растягивание выполняется даже в том случае, если у этой колонки установлено свойство Растягивать по горизонтали в значение Ложь. Если растягивание колонки необходимо избежать, то следует вынести колонку растягиваемую колонку из группы и расположить отдельно.

Свойство Поиск при вводе символов отвечает за то, каким образом система будет обрабатывать набор символов с клавиатуры, если активным элементом является таблица и в колонку невозможен непосредственный ввод данных:

Авто – в этом случае окно поиска открывается для таблицы, связанной с динамическим списком, для остальных таблиц окно поиска не открывается.

Использовать – окно поиска открывается для любых типов реквизитов, связанных с таблицей, если у колонки, в которой осуществляется ввод символов, свойство Режим редактирования установлено в значение Вход.

Не использовать – окно поиска не открывается для любых типов реквизитов, связанных с таблицей.

7.7.7. Кнопка

На форме команда отображается элементом формы Кнопка. Кнопка может отображаться в командной панели и просто на форме. В случае своего отображения на форме кнопка может также иметь вид гиперссылки (для этого нужно изменить свойство Вид).

Команда, к которой будет происходить обращение по нажатию кнопки, устанавливается с помощью свойства Команда.

Установленное свойство Только во "Все действия" означает, что по умолчанию кнопка будет находиться в меню Еще (Все действия), однако пользователь может сделать кнопку доступной на панели, воспользовавшись специальным редактором.

Для кнопки, связанной с командой Создать по параметру, имеется возможность указать тип документа, который будет создаваться при нажатии на кнопку. Это можно сделать с помощью свойства кнопки Параметр.

Если для команды формы не задано свойство Подсказка, то для кнопки, связанной с этой командой, не будет отображаться всплывающая подсказка. Если заголовок кнопки не может быть целиком отображен на кнопке, то полный текст заголовка отображается во всплывающей подсказке первой (или единственной, если для кнопки не задана подсказка) строкой.

Кнопка может иметь несколько режимов отображения (свойство Отображение). Если выбрано отображение Картинка и текст, то картинка, расположенная на кнопке, может располагаться слева или справо относительно текста кнопки. Для управления этим расположением предназначено свойство кнопки Положение картинки (доступно для кнопки формы и кнопки командной панели). Если данное свойство установлено в значение Авто, то картинка будет рсполагаться с левой стороны текста.

Рис. 265. Положение картинки кнопки

В том случае, если для кнопки выбрано отображение Картинка, картинка всегда будет располагаться по центру кнопки.

Кнопка управляемой формы может отображаться различными способами. Для этого предназначено свойство кнопки Фигура кнопки.

Рис. 266. Фигура кнопки

Данное свойство может принимать следующие значения:

Авто – в этом случае для стандартных команд используется значение, указанное для команды. Для остальных команд значение трактуется как Обычная.

Обычная, Овал – форма кнопки соответствует значению (рис.266).

Задавать фигуру кнопки можно для кнопок, расположенных на форме и в командной панели. Свойство не действует на команды, расположенные в подменю.

Для кнопки, отображаемой на форме, имеется возможность управлять отображением фигуры этой кнопки. Это осуществляется с помощью свойства Отображение фигуры.

Рис. 267. Отображение фигуры кнопки

Для отображения фигуры кнопки можно указать несколько различных способов:

Авто – в этом случае для стандартных кнопок используется вариант отображения, заданный для команды. В остальных случаях трактуется как Всегда.

Всегда – в этом случае фигура кнопки отображается всегда (первая строка в примере на рис.267).

При активности – в этом случае в обычном состоянии кнопка отображается без фона и рамки (вторая строка в примере на рис. 267). В том случае, если курсор мыши указывает на кнопку, на ней установлен фокус ввода или у кнопки установлено свойство Пометка – отображается стандартная кнопка с заданными цветами рамки и фона.

Нет – в этом случае в обычном состоянии кнопка отображается без фона и рамки. При наведении курсора у текста появляется подчеркивание (третья строка в примере на рис. 267) и изменяется курсор мыши. Свойство Пометка никак не отображается в этом варианте отображения.

Свойство определяет отображение для кнопок, расположеных на форме и в командных панелях. Свойство Отображение фигуры не действует на команды, расположенные в подменю.

Еще одним способом управления внешним видом кнопки является задание свойства Вид. В зависимости от того, где расположена кнопка, это свойство может принимать значения:

Обычная кнопка, Кнопка командной панели – в этом случае кнопка отображается обычным образом;

Гиперссылка, Гиперссылка командной панели – в этом случае кнопка отображается в виде гиперссылки.

При перетаскивании кнопки между формой и командной панелью, значение свойства Вид сохраняется, адаптируясь к расположению команды.

7.7.8. Группа

При разработке формы имеется возможность различного объединения элементов. Можно объединять поля, страницы формы, команды, колонки.

На форме могут находиться группы элементов управления. Это могут быть группы полей, страницы, группы команд. Также для элементов типа Таблица можно создавать группы колонок.

В редакторе можно создать группы следующих видов:

Обычная группа – предназначена для объединения элементов формы. Такая группа может обладать различными вариантами обрамления:

Нет – группа специально никак не выделяется;

Слабое выделение – заголовок группы отображается большим шрифтом зеленого цвета;

Обычное выделение – заголовок группы отображается большим шрифтом зеленого цвета. Вокруг элементов группы (с каждой стороны) формируются отступы;

Сильное выделение – заголовок группы отображается большим шрифтом зеленого цвета. С левой стороны (на всю высоту группы) формируется полоса зеленого цвета. Снизу формируется отступ.

Если у обычной группы задан цвет фона, отличный от Авто, то у группы со всех сторон появляются внутренние отступы.

Обычную группу можно настроить таким образом, что пользователь (в режиме «1С:Предприятия») сможет сворачивать или разворачивать такую группу. Например, можно разместить в сворачиваемой группе информацию, которая не важна при регулярной работе с формой, но иногда может потребоваться для просмотра и анализа.

Поведение группы (обычная или сворачиваемая) определяется свойством Поведение. Начальное состояние группы определяется флажком Свернута. Группа не может быть свернута или развернута, если у нее не отображается заголовок или заголовок не заполнен. Прикладной разработчик не может определить текущее состояние группы из встроенного языка. Также он не может принудительно свернуть или развернуть группу.

Пользователь может управлять состоянием группы (свернутая или развернутая) с помощью специальной картинки или гиперссылки. Для задания элемента, управляющего состоянием, служит свойство Отображение управления. Также можно задать заголовок группы (свойство Свернутый заголовок), который будет отображаться в том случае, если группа находится в свернутом состоянии. Если свойство Свернутый заголовок не заполнено, то в свернутом состоянии будет отображаться обычный заголовок группы.

Командная панель – элемент формы, предназначенный для размещения кнопок и групп. Свойство командной панели Источник команд определяет элемент формы (Форма, а также элементы формы типа Таблица и поля вида Поле табличного документа или Поле графической схемы), который предоставит «свои» команды для отображения в командной панели. Состав команд для отображения в командной панели регулируется свойством Состав команд элемента формы, являющегося источником команд.

В том случае, когда в командной панели у всех кнопок свойство ТолькоВоВсехДействиях имеет значение Ложь и не все кнопки могут быть размещены на командной панели (по ширине), в командной панели автоматически формируется кнопка Еще (с подменю). В это подменю размещаются все команды командной панели.

Группа, добавляемая в командную панель, может быть одного из следующих видов:

Подменю – группа, которая позволяет делать выпадающие меню.

Группа кнопок – позволяет создать группу кнопок, которые будут обладать следующими свойствами:

● группа кнопок отделяется разделителями слева и справа;

● каждая группа кнопок может обладать собственным источником команд;

● имеется возможность задать плотность расположения кнопок в группе: компактно или обычно (свойство Отображение). Значение свойства Авто трактуется как Обычное.

Рис. 268. Расположение кнопок группы

Свойство Отображение действует только на те кнопки командной панели, для которых свойство Отображение фигуры трактуется как Всегда (см. здесь).

Страницы – данная группа предназначена для организации панели с закладками. Закладки могут располагаться как по вертикали, так и по горизонтали. Для того чтобы добавить на такую панель страницы, необходимо добавить столько вложенных групп, сколько страниц должно быть у панели. Внутри группы вида Страницы могут располагаться только группы вида Страница – группы специального вида, которая предназначена для формирования страниц панели. Данная группа может содержать другие вложенные элементы.

Группа колонок – позволяет объединять колонки в таблице. С помощью группы этого вида можно изменять правило группировки колонок (вертикальная или горизонтальная группировка).

Группы могут быть вложенными.

Элементы формы можно перемещать между группами. При этом автоматически определяется допустимость такого переноса. В случае если перенос требует изменения каких-либо свойств элемента (например, Вид), изменение осуществляется автоматически. Если в результате изменились требования к подчиненным элементам, они либо автоматически изменяются, либо удаляются.

Свойство Только просмотр группы влияет на все элементы, подчиненные группе.

Свойство группы Разрешить изменение состава управляет возможностью изменять состав группы в процессе настройки формы пользователем. Если свойство выключено, то пользователь не может изменять состав и менять порядок элементов внутри группы. Однако свойство не влияет на возможность пользователя изменить видимость элементов, входящих в состав группы.

Если у группы указано свойство Данные заголовка, то эти данные будут автоматически отображаться в заголовке группы. Если у группы установлено свойство Заголовок, то данные заголовка отображаются в скобках после заголовка: Заголовок (Данные заголовка).

Любая группа кнопок (командная панель, подменю, группа кнопок, контекстное меню) заполняется по одинаковым правилам. Кнопки будут отображены в следующем порядке:

1. Кнопки, предоставляемые источником команд, с которым связана данная группа.

2. Кнопки командного интерфейса, если источник команд подразумевает его включение.

3. Пользовательские команды, добавленные в данную группу.

4. Команды меню Еще (Все действия) (только для командной панели).

5. Последней будет размещена Справка (в том случае если она была предоставлена источником команд).

Если вышеприведенный автоматический порядок расположения кнопок в группе не устраивает, то можно воспользоваться следующими возможностями:

● Снять флажок Автозаполнение для командной панели формы, контекстного меню или командной панели элемента и добавить нужные команды (в нужном порядке) вручную.

● Отключить источник команд командной панели, затем добавить нужные команды (в нужном порядке) вручную, затем добавить группу типа Группа кнопок и установить для добавленной группы источник команд.

● Можно вручную поместить кнопку, связанную со стандартной командой источника команд, в необходимое место командной панели. В этом случае соответствующая команда не будет использоваться при автоматическом размещении команд источника в текущей командной панели, а останется на том месте, куда ее разместили вручную.

7.7.9. Дополнение элемента формы

Дополнение элемента формы предназначено для отображения дополнительных свойств элемента формы (дополнения элемента формы) и управления этими элементами. Существуют следующие дополнения:

● Отображение строки поиска. Позволяет настроить отображение строки поиска (см. здесь).

● Состояние просмотра. Позволяет настроить отображение перечня примененных поисковых запросов (см. здесь). Не может располагаться в командной панели.

● Управление поиском. Позволяет настроить внешний вид кнопки управления поиском (см. здесь).

7.7.10. Специальные командные панели

Кроме создания собственных командных панелей (элемент формы Группа вида Командная панель) редактор форм предоставляет возможность работать со специализированными командными панелями:

Командная панель формы – система предоставляет командную панель формы. Ее видимостью, положением и наполнением можно управлять. Видимость и положение панели управляются с помощью свойства командной панели Выравнивание, а содержимое управляется свойством Автозаполнение. Кроме стандартных команд, которые могут быть добавлены на командную панель формы, туда автоматически добавляются команды из раздела Командная панель формы глобального командного интерфейса.

Если основным реквизитом формы является динамический список и у командной панели формы установлено свойство Автозаполнение, то в нее автоматически будут добавлены команды, предоставляемые этим динамическим списком. Если на форме также присутствует элемент формы, отображающий дерево, то командная панель формы будет дополнена командами, которые предоставлены реквизитом, связанным с таким элементом.

Командная панель таблицы – системой автоматически предоставляется командная панель для элемента формы вида Таблица. Ее видимостью, положением и наполнением можно управлять. Видимость и положение панели управляются с помощью свойства командной панели Выравнивание, а содержимое управляется свойством Автозаполнение.

Контекстное меню элемента – имеется возможность модифицировать стандартное контекстное меню элемента формы. Для этого контекстное меню необходимо отобразить в дереве элементов формы с помощью команды контекстного меню Показать контекстное меню элемента формы.

Если в контекстное меню элемента добавить элемент вида Группа и указать у этой группы в качестве источника команд другой элемент формы, то добавленная группа будет заполнена командами (в режиме 1С:Предприятие) по тем же правилам, что и контекстное меню элемента, выбранного в качестве источника команд.

Во все вышеперечисленные командные панели можно добавлять собственные команды, которые создаются с помощью редактора команд.

Если есть необходимость поместить команды, расположенные в командной панели формы (см. здесь), в какую-либо командную панель, то необходимо выполнить следующее:

● Разместить в командной панели элемент Группа – Командная панель.

● Выбрать у этой группы в качестве источника команд Глобальные команды командной панели формы.

Если в командной панели или контекстном меню, содержащем группу с источником команд Глобальные команды командной панели формы, есть группа, для которой установлен источник команд Форма, то при заполнении этой группы команды, относящиеся к командному интерфейсу формы, не добавляются.

При установке (из встроенного языка) в качестве текущего элемента кнопки какой-либо командной панели, следует помнить, что фокус будет установлен на первую кнопку командной панели, а не на ту кнопку, которую используют в операции установки текущего элемента: ЭтотОбъект.ТекущийЭлемент = Элементы.КнопкаКоманднойПанели;.

Если в процессе контекстного серверного вызова в форме выполнены следующие изменения: изменена структура данных; добавлены или удалены команды формы; добавлены, удалены или перемещены элементы формы; изменены параметры таблиц управляемой формы, то будет выполнено перезаполнение стандартных командных панелей и групп. При этом:

● все пользовательские команды, вставленные в такие панели и группы, будут удалены;

● измененные параметры стандартных команд будут установлены в значения по умолчанию.

7.7.11. Условное оформление формы

Форма позволяет устанавливать условное оформление элементов формы. Настройка условного оформления выполняется аналогично настройке условного оформления системы компоновки данных. Вызов настройки условного оформления доступен из панели свойств корневого элемента формы.

Доступны следующие виды условного оформления:

Цвет фона – позволяет изменять цвет фона и применяется для:

● Элементов формы: поле ввода, поле текстового документа, таблица, обычная кнопка.

● Полей таблицы: поле надписи, поле ввода, поле переключателя, поле картинки.

Цвет текста – позволяет изменять цвет текста и применяется для:

● Элементов формы: поле надписи, поле ввода, поле текстового документа, поле картинки, поле переключателя, таблица, обычная кнопка, гиперссылка, декорация-текст, декорация-картинка.

● Полей таблицы: поле надписи, поле ввода, поле переключателя.

Шрифт – позволяет изменять шрифт и применяется для:

● Элементов формы: поле надписи, поле ввода, поле текстового документа, поле картинки, поле переключателя, поле календаря, таблица, обычная кнопка, гиперссылка, декорация-текст, декорация-картинка.

● Полей таблицы: поле надписи, поле ввода.

Примечание. Изменение шрифта элемента формы, выполненное с помощью условного оформления, не учитывается при определении размера элементов.

Выделять отрицательные – позволяет задать выделение отрицательных значений. Применяется для следующих элементов формы: поле надписи, поле ввода и поля таблицы: поле надписи, поле ввода.

Горизонтальное положение – задает горизонтальное положение значения и применяется для:

● Элементов формы: поле надписи, поле ввода, декорация-текст.

● Полей таблицы: поле надписи, поле ввода.

Отметка незаполненного – позволяет задать отметку незаполненного значения и применяется для:

● Элементов формы: поле ввода, таблица.

● Полей таблицы: поле ввода.

Совет. Если управление свойством Отметка незаполненного выполняется с помощью условного оформления, то рекомендуется для оформляемого поля установить свойство Автоотметка незаполненного в значение Нет.

Текст – используется для задания текста и применяется для полей таблицы: поле надписи, поле ввода.

Формат – позволяет изменить формат вывода значения и применяется для:

● Элементов формы: группа вида Страница, группа вида Обычная группа.

● Полей таблицы: поле надписи, поле ввода.

Видимость – используется только для отключения отображения полей таблицы: поле надписи, поле ввода, поле переключателя, поле картинки. Место ячеек с отключенным отображением занимается за счет изменения размера соседних ячеек. Алгоритм растягивания ячеек может различаться в различных клиентских приложениях.

Не рекомендуется использовать условное оформление для скрытия в таблице строк целиком. Использование условного оформления для скрытия строк может негативно влиять на производительность и приводить к некорректному отображению содержимого таблицы.

При управлении видимостью на мобильной платформе следует помнить о следующей особенности: в том случае, когда видимость поля таблицы зависит от данных текущей строки, то при отсутствии текущей строки (см. здесь) отображение заголовка колонок может не соответствовать ни одной видимой строке таблицы. Заголовки станут соответствовать текущей строке только при появлении текущей строки в таблице, для которой задано условное оформление. При использовании условного оформления, зависящего от данных текущей строки, на мобильной платформе не рекомендуется отображать заголовки такой таблицы.

Доступность – используется только для отключения доступности полей таблицы: поле надписи, поле ввода, поле переключателя, поле картинки.

Только просмотр – используется только для включения режима Только просмотр для полей таблицы: поле надписи, поле ввода, поле переключателя, поле картинки.

Отображать – используется только для отключения видимости значений полей таблицы: поле надписи, поле ввода, поле переключателя, поле картинки.

Примечание. Для условного оформления используется текущая дата компьютера, скорректированная с учетом часового пояса сеанса «1С:Предприятия». Подробнее про часовые пояса см. здесь.

Если с помощью условного оформления оформляется колонка таблицы формы, а в условии есть поле реквизита, отображаемого оформляемой таблицей, то при вычислении условия используются текущие данные той таблицы, к которой относится оформляемая колонка. Если оформляемое поле не относится к таблице, то для вычисления условия используются текущие данные первой (по порядку размещения в редакторе формы) таблицы формы.

Условное оформление позволяет задавать некоторые виды оформления элементов формы в зависимости от значений реквизитов формы, при этом оформление формы будет динамическим, т. е. будет учитывать изменение данных формы. Для изменения оформления формы не требуется никаких специальных действий. Если для условного оформления формы используются поля динамического списка, то для этих полей следует установить свойство Использовать всегда.

Рассмотрим пример условного оформления.

Допустим, нам необходимо в документе Расход товара выделить те строки табличной части, в которых количество менее 10 штук.

Для этого нужно в условном оформлении формы задать следующие условия:

● Вид условного оформления – цвет текста. В качестве значения цвета выберем Особый текст из стиля.

● В качестве условия выберем следующее выражение: Объект.Товары.Количество Меньше "10". В этом выражении Объект – основной реквизит формы, Товары – табличная часть, Количество – реквизит табличной части.

● В качестве оформляемых полей выберем всю табличную часть Товары.

Рис. 269. Настройка условного оформления

Результат работы условного оформления можно увидеть на рис. 270.

Рис. 270. Результат условного оформления

Таким образом, цвет шрифта первой строки табличной части стал красным, т. к. количество товара в этой строке меньше 10.

Однако выделять особым цветом всю строку не всегда нужно, а нужно выделять непосредственно ячейку табличной части с количеством.

Для этого изменим заданное условное оформление: в качестве оформляемых полей выберем не всю табличную часть Товары, а конкретное поле: Количество.

В этом случае будет выделено только одно поле:

Рис. 271. Оформление одного поля табличной части

Также следует отметить возможность использовать значения колонок, не связанных с данными информационной базы, в выражениях условий.

7.7.12. Особенности поведения элементов формы

Если в заголовках полей или декорациях типа Надпись используются символы алфавита, не поддерживаемые шрифтом, который установлен для этих элементов формы, то возможен некорректный расчет длины отображаемых строк. Как следствие – строки в этих элементах формы могут выводиться не полностью.

При необходимости использования в решениях шрифтов, отличных от шрифта, определяемого значением Авто соответствующего свойства, рекомендуется ограничиваться следующими шрифтами:

● Стилевые шрифты системы «1С:Предприятие»:

● Мелкий шрифт текста,

● Обычный шрифт текста,

● Крупный шрифт текста,

● Очень крупный шрифт текста.

● Векторные шрифты из состава пакета «MS Core Fonts»:

● Andale Mono,

● Arial,

● Arial Black,

● Comic Sans MS,

● Courier New,

● Georgia,

● Impact,

● Times New Roman,

● Trebuchet MS,

● Verdana,

● Webdings.

При использовании других шрифтов не гарантируется корректное отображение элементов формы в различных клиентских приложениях или операционных системах.

Поведение полей формы вида надпись, картинка, декорация-надпись, декорация-картинка не зависят от установки режима ТолькоПросмотр (как для конкретных элементов формы, так и для формы в целом).

Если у реквизита формы типа Число свойства Длина и Точность заданы одинаковыми значениями, то поле ввода позволяет ввести любое число, но при попытке покинуть поле ввода будет выдано сообщение о некорректном вводе, если введенное значение не находится в диапазоне от -1 до 1 (исключая -1 и 1).

Элемент формы Кнопка, связанный с командой, у которой свойство Изменяет сохраняемые данные имеет значение Истина, будет отображаться запрещенным, если для него (или формы в целом) установлено свойство ТолькоПросмотр равным значению Истина.

Если в обработчике ПриИзменении поля, расположенного в таблице формы, выполняются действия, которые ведут к вызову сервера и перестроению формы, то обработчики событий этой таблицы ПриОкончанииРедактирования и ПередОкончаниемРедактирования не будут вызваны.

Табличный документ, расположенный на форме, по вертикали прокручивается построчно.

Если для поля ввода или поля надписи свойство Высота установлено в значение большее, чем 1, и свойство Растягивать по вертикали установлено в значение Авто, то это значение будет трактоваться как Истина, т. е. указанные элементы формы будут растягиваться по вертикали.

Выпадающий список поля ввода подстраивает свою ширину под ширину отображаемых в нем элементов. Минимальная ширина выпадающего списка определяется как максимальное значение из следующих значений:

● фиксированного значения, заданного в платформе;

● значение свойства ШиринаВыпадающегоСписка расширения поля управляемой формы для поля ввода.

Если один из элементов, отображаемых в выпадающем списке шире, чем рассчитанная минимальная ширина списка, то ширина выпадающего списка равняется ширине самого широкого отображаемого элемента, но не больше:

● размер экрана для тонкого клиента;

● размер формы для веб-клиента.

7.7.13. Правила размещения элементов формы

7.7.13.1. Общая информация

Элементы формы размещаются в прямоугольной логической сетке. Данная сетка является иерархической, при этом самым верхним уровнем логической сетки выступает сетка, заданная для формы, а в ячейке логической сетки формы может образовываться своя логическая сетка, если элементом формы, который находится в этой ячейке, является группа типа Обычная группа или группа типа Страница. Собственно форма, группа типа Обычная группа и группа типа Страница далее будут называть группирующим элементом формы. Ширина ячейки логической сетки определяется шириной элемента формы, расположенной в этой ячейке, а высота – логической строкой. Понятие «логическая строка» не описывается определенными числовыми параметрами. Проще всего показать это понятие на примере. Для этого создадим форму со следующей структурой

Рис. 272. Структура формы

В редакторе видны следующие элементы:

● Собственно форма с установленной вертикальной группировкой и отключенной командной панелью формы.

● Группа без отображения Группа1 с горизонтальной группировкой. В этой группе размещены элементы Элемент1 и Элемент3.

● Группа без отображения Группа2 с горизонтальной группировкой. В этой группе размещены элементы Элемент2 и Элемент4.

Для некоторого уменьшения размера рисунка, для таблицы Элемент3 уменьшена высота таблицы. На работу алгоритма размещения элементов (в данном примере) данное изменение не влияет.

Рис. 273. Понятие логической сетки

На рис. 273 изображены 2 строки логической сетки. В первой строке расположены элементы Элемент 1 и Элемент 3, а во второй – Элемент 2 и Элемент 4. Легко заметить, что каждая из описанных строк будет иметь разную высоту. Но, тем не менее, в логической сетке формы будет использоваться именно две строки. Таким образом, высота строки логической сетки вычисляется по высоте самого высокого элемента из всех, которые расположены на одной горизонтали. Для первой строки высота будет определяться по высоте элементов Элемент 1 и Элемент 3, а для второй строки – по высоте элементов Элемент 2 и Элемент 4.

Также необходимо отметить, что каждая строка у формы имеет свою ширину ячейки. Это происходит потому, что элементы Элемент 1 и Элемент 3 располагаются в одном группирующем элементе, а Элемент 2 и Элемент 4 – в другом группирующем элементе. В рамках каждого группирующего элемента размещение элементов выполняется обособленно.

Таким образом, видно, что в данном примере имеется три логических сетки:

1. логическая сетка формы. Для данного примера задается сетка 2 x 1: два элемента (группы) с вертикальной группировкой, заданной для формы.

2. логическая сетка группы с элементами Элемент 1 и Элемент 3. Эта группа определяет сетку 1 x 2: два элемента (Элемент 1 и Элемент 3) в группе с горизонтальной группировкой для группы. Эта сетка вложена в логическую сетку уровня формы.

3. логическая сетка группы с элементами Элемент 2 и Элемент 4. Эта группа определяет сетку 1 x 2: два элемента (Элемент 2 и Элемент 4) в группе с горизонтальной группировкой для группы. Эта сетка также вложена в логическую сетку уровня формы.

В дальнейшем, при упоминании размещения элементов, будет пониматься описанная выше логическая сетка. При разработке формы следует придерживаться следующих простых рекомендаций, которые обеспечат работоспособность разрабатываемой формы на всех поддерживаемых экранах и разрешениях:

● По возможности использовать значения по умолчанию для свойств элементов.

● Минимизировать явное указание размеров элементов формы.

В общем случае можно определить правила размещения элементов формы следующим образом:

● Элементы формы размещаются по двум направлениям:

● горизонтальное – каждый новый элемент формы располагается правее предыдущего. Такую группу можно представить как матрицу 1 x N, где N – количество элементов в группе.

● вертикальное – каждый новый элемент формы располагается ниже предыдущего. Такую группу можно представить как матрицу N x 1, где N – количество элементов в группе.

Направление размещения зависит от свойства Группировка группирующего элемента форма: форма или группа. При размещении не накладывается ограничений по количеству отображаемых элементов.

Таким образом, комбинируя группы с разными настройками группировки и вкладывая группы одна в другую, можно создавать достаточно сложные (по структуре) формы. При этом система предоставляет возможность управлять выравниванием элементов как внутри одного группирующего элемента, так и между ними (подробнее см. здесь).

● Порядок отображения элементов определяется порядком их следования на закладке Элементы редактора формы.

● Имеется возможность влиять на размещение элементов с помощью следующих параметров:

● Горизонтальный и вертикальный интервал размещения элементов;

● Размер элементов;

● Выравнивание элементов;

● Возможность растягивать элементы по горизонтали и вертикали;

● И т. д.

● Область размещения элементов ограничена размером окна, в котором формируется форма. Размер окна ограничен размерами рабочей области основного окна или параметрами экрана. Если в результате размещения совокупный размер элементов превысит размер окна, отведенного форме по соответствующей координате (вертикальной или горизонтальной), то в форме появятся линейки прокрутки.

● Правила размещения элементов внутри группы эквивалентны правилам размещения внутри формы.

На размещение элементов одновременно оказывают влияние как общие правила размещения (описанные выше), так и особенности обработки различных параметров, влияющих на размещение. Общее количество сочетаний всех влияющих параметров крайне велико, поэтому далее будет рассмотрена работа наборов подобных свойств. Сочетания всех влияющих свойств рассмотрено не будет. Описание свойств, влияющих на расположение элементов, а также алгоритмов размещения, будет приведено далее в этом разделе.

Формирование формы, в том виде, как она отображается пользователю, состоит из двух этапов:

1. На сервере:

● Система получает дерево элементов формы.

● Из дерева элементов исключаются элементы, которые отключены функциональными опциями (см. здесь), правами доступа (см. здесь) и пользователем (с помощью диалога настройки формы).

● Получившееся дерево элементов используется для формирования описания формы – внутреннего представления формы, которое еще не пригодно для непосредственного отображения. В этом описании определены реальные значения для свойств, установленные в значения Авто. Никаких других расчетов в данный момент не выполняется (размеры элементов формы, видимость элементов и т. д.)

● Получившееся описание формы передается на сторону клиента.

2. На клиенте:

● Клиентское приложение определяет характеристики экрана, на котором будет отображаться форма: ориентация, размеры, используемые шрифты и т. д.

● На основании полученной информации определяются размеры элементов формы, обрабатывается видимость элементов и т. д. Из описания формы также исключаются группы и таблицы, для которых не осталось видимых подчиненных элементов. В результате получается описание формы, которое практически полностью соответствует тому, как это будет видеть пользователь: элементы размещены в ячейках используемой сетки, рассчитаны размеры элементов. При этом следует понимать, что размер элементов зависит от текущего шрифта, особенностей самого элемента и используемого клиентского приложения.

● Полученная «почти форма» преобразуется в реальный набор элементов управления целевой платформы (тонкий клиент, толстый клиент, веб-клиент, мобильное устройство) и отображается пользователю.

Особенности размещения элементов формы в режиме совместимости с версией 8.3.6 и ниже, рассмотрены в документации к «1С:Предприятию» версии 8.3.6 (http://its.1c.ru/db/v836doc#bookmark:dev:TI000000404).

7.7.13.2. Группы и объединение элементов формы

Элементы формы можно объединять в группы, для чего служит специальный элемент формы Группа. Объединение в группы позволяет упростить управление элементами, визуально выделять элементы на форме и управлять группировкой элементов (с помощью свойства Группировка). Доступны несколько видов элемента формы Группа, каждый из которых имеет свои особенности по управлению группировкой:

Командная панель – управление группировкой недоступно.

Страница – позволяет управлять группировкой элементов.

Обычная группа – позволяет управлять группировкой элементов.

Группа колонок – позволяет управлять группировкой элементов (колонок таблицы формы).

Для группы вида Обычная группа или Страница можно задавать группировку (свойство Группировка) элементов. Опишем пример использования такой группировки.

Рис. 274. Вертикальная группировка

Рассмотрим создание формы документа. При этом группировка элементов формы выбрана как Вертикальная, но мы хотим, чтобы реквизиты документа Дата и Номер располагались не в двух строках, а в одной.

Для этого мы создадим группу с именем ДатаИНомер, установим свойство Группировка в значение Горизонтальная и поместим туда элементы формы Номер и Дата.

Рис. 275. Горизонтальная группировка

Комбинацией вышеперечисленных способов является способ Горизонтальная если возможно. В этом случае элементы будут располагаться горизонтально, если размеры родительского группирующего элемента позволят разместить все подчиненные элементы горизонтально. В противном случае элементы будут размещены вертикально. Такое размещение выполняется системой автоматически.

Имеется возможность аналогичным образом изменять расположение колонок в таблице формы. В качестве примера рассмотрим форму списка, в которой имеются колонки Код и Артикул.

Рис. 276. Исходное расположение колонок

Однако в нашем списке необходимо сделать так, чтобы код и артикул располагались в две строки, один под другим. Для этого необходимо создать группу колонок, подчиненную элементу Список, и задать ему имя КодИАртикул (например). Затем для группы колонок следует задать вертикальную группировку.

Рис. 277. Вертикальная группировка колонок

Но есть необходимость, чтобы код и артикул имели общий заголовок (например, Коды). Для этого необходимо выполнить следующие действия:

● Для группы колонок КодИАртикул задать свойство Заголовок;

● Затем для этой же группы установить свойство Отображать в шапке;

● Последним шагом следует установить свойство Отображать заголовок.

В результате получится следующая форма:

Рис. 278. Заголовок группы

Теперь необходимо сделать так, чтобы на форме не отображались заголовки колонок Код и Артикул (чтобы не увеличивалась высота шапки таблицы). Для этого необходимо выполнить следующие действия:

● Необходимо выделить элементы Код и Артикул;

● Сбросить флажок Отображать в шапке. Эту операцию можно проделать и для каждого элемента отдельно (без выделения сразу двух элементов).

В результате получится следующая форма:

Рис. 279. Отображение только заголовка группы

Таким образом, в рамках таблицы имеется возможность гибко изменять расположение колонок и их оформление для того, чтобы получить нужный вид таблицы.

Примечание. Следует отметить, что группы могут иметь неограниченную вложенность. При этом свойство Группировка может быть разным для каждой вложенной группы.

7.7.13.3. Размеры элементов формы

При определении реального размера каждого элемента формы система ориентируется на ограничения, которые прикладной разработчик установил при разработке формы. Имеется возможность управлять следующими свойствами элементов:

● Для управления шириной элемента:

Ширина – ширина элемента. Значение данного свойства задается в абстрактных величинах, зависящих от средней ширины символа стандартного шрифта формы в текущем варианте интерфейса, с учетом особенностей отображения конкретного элемента и клиентского приложения.

АвтоМаксимальнаяШирина – признак того, что система автоматически рассчитывает максимальную ширину данного элемента. Существует не у всех элементов.

МаксимальнаяШирина – максимальная ширина элемента, указанная прикладным разработчиком. Существует не у всех элементов.

● Для управления высотой элемента:

Высота – высота элемента. Значение данного свойства задается в абстрактных величинах, зависящих от шрифта, установленного для данного элемента, с учетом особенностей отображения данного элемента и клиентского приложения.

АвтоМаксимальнаяВысота – признак того, что система автоматически рассчитывает максимальную высоту данного элемента. Существует не у всех элементов.

МаксимальнаяВысота – максимальная высота элемента, указанная прикладным разработчиком. Существует не у всех элементов.

● Также следует упомянуть, что на линейные размеры элемента оказывает влияние значения свойств РастягиватьПоГоризонтали и РастягиватьПоВертикали.

Следует понимать, что ширина и высота элемента формы не описывают размер области данных элемента (см. здесь). Эти параметры описывают общие размеры элемента, включающие заголовок, командные панели и т. д.

Реальный размер элемента формы в режиме 1С:Предприятие может не совпадать с указанными размерами. При определении размеров элементов система учитывает шрифт (и его размеры), указанный в свойствах элементов формы.

Примечание. Изменение шрифта элемента формы, выполненное с помощью условного оформления, не учитывается при определении размера элементов.

Вычисление размера элемента по любой оси зависит от состояния растягивания по этой оси:

● Растягивание выключено:

● Явно указанное свойство Ширина (Высота) определяет размер элемента. В этом случае свойства, определяющие максимальный размер элемента, игнорируются.

● Свойство Ширина (Высота) установлено в значение 0. Это означает автоматическое определение размера элемента. В этом случае размер элемента по соответствующему измерению определяется по содержимому элемента. При этом размер элемента не может быть больше максимального размера. Максимальный размер элемента по соответствующей оси может быть указан как вычисляемый автоматически (свойства АвтоМаксимальная…) так и явно задан вручную (свойства Максимальная…).

● Растягивание включено:

● Явно указанное свойство Ширина (Высота) определяет «весовой» коэффициент растягивания/сжатия.

● Свойство Ширина (Высота) установлено в значение 0. Это означает автоматическое определение размера элемента. Система подберет подходящий размер исходя из типа данных, содержимого и других параметров. При этом размер элемента не может быть больше максимального размера. Максимальный размер элемента по соответствующей оси может быть указан как вычисляемый автоматически (свойства АвтоМаксимальная…) так и явно задан вручную (свойства Максимальная…).

● Если максимальная ширина или высота элемента установлена в значение 0, то по соответствующему измерению элемент может изменять размер неограниченно.

● При определении ширины поля ввода действуют следующие особенности:

● Если свойство МаксимальнаяШирина задано явно (свойство АвтоМаксимальнаяШирина выключено), то оно определяет максимальную ширину в символах. При этом, например, кнопки поля ввода входят в эту ширину.

● Если свойство АвтоМаксимальнаяШирина включено, то максимальная ширина определяется в зависимости от типа поля ввода, и кнопки также входят в неё для лучшего выравнивания по правой границе. Свойство Ширина в этом случае работает по-другому: если оно равно 0, то определяется ширина в зависимости от типа поля ввода, и к ней прибавляется количество включенных кнопок.

При определении размеров элементов ограничивающим фактором «сверху» выступают размеры родительских группирующих элементов: формы, группы, страницы. Размер группирующего элемента ограничивает изменение размеров вложенных элементов. Другими словами, если у группы задана ширина и запрещено растягивание, но для всех подчиненных элементов заданная ширина группы будет выступать ограничением при вычислении ширины этих подчиненных элементов.

7.7.13.4. Растягивание групп

Изменение размеров обычной группы (растягивание) зависит от значения свойств Растягивать по вертикали и Растягивать по горизонтали:

Авто – растягиваемость определяется подчиненными элементами группы. Если есть хотя бы один подчиненный элемент, для которого возможно растягиванием означает, что группа также может растягиваться.

Да – группа растягивается без ограничений. Если у группы свойство Выравнивание элементов и заголовков установлено в значение Элементы право, …, то такие элементы будут двигаться вместе с правой границей группы, если сами элементы не могут растягиваться.

Нет – группа не растягивается. Размер определяется вложенными элементами или свойством группы Ширина.

Растягивание обычной группы формы не влияет на растягивание подчиненных элементов в рамках текущих размеров группы элементов.

7.7.13.5. Управление расстоянием между элементами

Для некоторых специфических форм может возникать потребность размещать элементы более плотно или, наоборот, более разрежено. Такое требование может возникать как для всей формы, так и для некоторых ее фрагментов. Причем изменять расстояние между элементами может потребоваться как по вертикали, так и по горизонтали.

Для решения этой задачи у группирующих элементов существуют свойства Горизонтальный интервал и Вертикальный интервал. Изменяя эти свойства, можно добиться необходимой плотности элементов формы.

Значение Авто, установленное у любого из этих свойств, означает, что интервал будет определяться по родительскому группирующему элементу. Для формы значение интервала Авто определяет платформа.

На рисунке ниже приведен пример двух предельных вариантов установки вертикального интервала между элементами.

Рис. 280. Различный вертикальный интервал

7.7.13.6. Выравнивание элементов формы

7.7.13.6.1. Общая информация

Элемент формы состоит из области данных – области элемента формы, в которой отображаются данные, и области заголовка (заголовок) – области элемента формы, которая отображает заголовок (см. рис. 281). Стандартная ширина области данных определяет ширину области данных и обладает следующими свойствами:

● определяется типом данных реквизита, связанных с элементом формы или свойством Ширина элемента формы;

● не зависит от свойства элемента формы Растягивать по горизонтали.

Рис. 281. Структура элемента формы

При осуществлении выравнивания, ориентация заголовков и областей данных формируется относительно воображаемой линии, которая проходит по границе между заголовками и данными всех элементов, расположенных в группирующем элементе. При этом размер области заголовков рассчитывается по максимальной ширине заголовка всех элементов.

Рис. 282. Базовая линия для выравнивания

7.7.13.6.2. Выравнивание в рамках группы

В рамках группирующего элемента выравнивание границ компонентов элемента формы определяется свойством Выравнивание элементов и заголовков. Данное свойство позволяет задать следующие варианты выравнивания:

Нет. В этом случае область данных располагается сразу после окончания заголовка. Никакого выравнивания не выполняется.

Рис. 283. Выравнивание: нет

Элементы лево, заголовки лево. Это режим выравнивания, который применялся в «1С:Предприятие» версии 8.3.6 и младше. В этом случае заголовки полей выравниваются по левой границе группирующего элемента. Области данных также выравниваются по левой границе.

Рис. 284. Выравнивание: лево-лево

Элементы право, заголовки лево. В этом случае заголовки полей выравниваются по своей левой границе, а данные – по правой границе.

Рис. 285. Выравнивание: право-лево

● Элементы лево, заголовки право. В этом случае заголовки выравниваются по правой границе, а данные – по левой.

Рис. 286. Выравнивание: лево-право

● Элементы право, заголовки право. В этом случае все части элемента формы выравниваются по правой границе «своей» области.

Рис. 287. Выравнивание: право-право

Как уже было сказано выше, выравнивание границ осуществляется в рамках текущего группирующего элемента. В связи с этим, результирующее выравнивание элементов может оказать не вполне удовлетворительным.

Рис. 288. Сквозное выравнивание по умолчанию

Однако в конкретном случае может оказаться, что флажки в группе ABC-классификация необходимо выравнивать относительно той же воображаемой линии, что и первые три элемента (Код, Наименование, Дата). Для управления таким поведением существует свойство Сквозное выравнивание (доступно для элемента группа управляемой формы). Если у группы ABC-классификация установить данное свойство в значение Использовать, то выравнивание несколько изменится:

Рис. 289. Сквозное выравнивание. Снизу «Использовать»

Видно, что группа ABC-классификация стала использовать для выравнивания ту же линию, что и первые три элемента. Данное поведение касается только первых левых элементов, которые располагаются в группе. Собственно выравнивание реализуется путем установки одинаковой ширины для заголовков элементов, которые (заголовки) расположены слева. Если данное свойство установлено в значение Авто, то сквозное выравнивание определяется платформой самостоятельно. Явное указание для данного свойства значения Не использовать приведет к тому, что в таком группирующем элементе не будет выполняться выравнивание с учетом элементов, не входящих в группу.

Сквозное выравнивание не используется для групп, свойство Поведение которых установлено в значение, отличное от Обычная.

7.7.13.6.3. Выравнивание между группами

При разработке сложных форм могут возникать проблемы, связанные с взаимным выравниванием элементов формы в том случае, если эти элементы расположены в разных группах.

Предположим, что необходимо создать форму, которая содержит флажки выбора действий и пояснений к этим действиям. Флажки реализованы собственно флажками (элементами формы), а пояснения – декорациями вида текст. Флажки расположены в одной группе, пояснения – в другой. Для упрощения примера, у групп отключены отображения заголовков и выделение собственно групп.

В результате получается следующая форма:

Рис. 290. Выравнивание между группами

В примере очевидно видна проблема: вертикальное выравнивание элементов в группах не соответствует желаемому – декорации явно имеют меньшую высоту, нежели флажки.

Для решения этой проблемы предназначено свойство группы формы Объединенная группа. Рассмотрим, как действует данное свойство.

Когда у группы установлено данное свойство, то в этом случае вся группа считается единым элементом (так настроен механизм размещения элементов формы). Именно в такое значение это свойство установлено при создании новой группы.

Если у группы выключить данное свойство, то механизм размещения элементов будет анализировать все элементы такой группы как отдельные элементы. Так, если отключить данное свойство у группы ГруппаДействий (на рис. 290), то форма приобретет следующий вид:

Рис. 291. Выравнивание между группами

Подробнее остановимся на том, что изображено на рис. 291. Основной вопрос заключается в следующем: почему первая строка из элемента ГруппаДействие по высоте заняла столько же, сколько и весь элемент ГруппаОписаний?

Как было сказано в самом начале, единицей измерения по горизонтали при размещении элементов формы является строка. Высота строки определяется как максимальная высота одного из элементов формы, которые расположены по одной горизонтали и у которых совпадают верхние границы (если предположить, что свойство Вертикальное положение в группе у всех элементов установлено в одинаковое значение). До тех пор, пока у обеих групп были установлены флажки Объединенная группа, каждая группа воспринималась системой размещения элементов как один элемент. Поэтому на форме группы располагались на одном уровне, а в рамках каждой группы выравнивание работало по-своему.

После того, как у элемента ГруппаДействие был сброшен флажок Объединенная группа, группа перестала восприниматься механизмом размещения как единое целое. Каждый элемент группы учитывается отдельно. Но для элемента ГруппаОписание флажок Объединенная группа по-прежнему установлен. Это значит, что механизм размещения считает, что элемент Действие1 и элемент ГруппаОписание расположены в одной строке, и высота этой строки соответствует высоте элемента ГруппаОписание.

Если теперь сбросить флажок Объединенная группа у элемента ГруппаОписание, то форма станет выглядеть следующим образом:

Рис. 292. Выравнивание между группами

В результате получилось желаемое поведение: размер декораций перестал оказывать влияние на общее выравнивание элементов.

Таким образом, с помощью свойства Объединенная группа, имеется возможность создавать группы, состоящие из нескольких колонок и строк одновременно, с поддержкой выравнивания элементов во всех колонках и строках:

● Свойство установлено – группа считается единым элементом;

● Свойство сброшено – каждый элемент, входящий в состав группы со сброшенным свойством, считается отдельным элементом.

Кроме этого, группа, у которой сброшено свойство Объединенная группа (группа становится «разъединенной»), обладает следующими особенностями:

● Из всех свойств группы используются только следующие свойства: Группировка, Цвет фона, Отображать заголовок и Отображение (для определения параметров определения заголовка группы). Свойство Группировка используется для определения порядка размещения элементов текущей группы в родительском группирующем элементе.

● Если свойство Отображать заголовок установлено в значение Истина, то заголовок группы помещается в группу более верхнего уровня в качестве первого элемента с соблюдением группировки, т. е. для горизонтальной группировки заголовок будет размещён слева от остальных элементов, для вертикальной выше остальных элементов.

● Не формируются разделители (см. здесь).

7.7.13.6.4. Управление относительным расположением элементов

При разработке различных форм возникает необходимость управления относительным расположением элементов формы. Например, необходимо, чтобы одна или несколько кнопок располагались по центру группы или формы.

Для организации такого расположения существуют несколько свойств:

Горизонтальное положение подчиненных. Доступно для группирующих элементов (форма, обычная группа и группа вида страница). Определяет, каково будут горизонтальное относительное расположение подчиненных элементов в рамках группирующего элемента.

Вертикальное положение подчиненных. Доступно для группирующих элементов (форма, обычная группа и группа вида страница). Определяет, каково будут вертикальное относительное расположение подчиненных элементов в рамках группирующего элемента.

Ниже приведен пример, когда для группы с горизонтальным расположением элементов кнопки располагаются по центру группы, а для группы с вертикальным расположением элементов кнопки располагаются в нижней части группы.

Рис. 293. Управление относительным расположением

В том случае, если любое из описанных свойств, установлено в значение Авто, то это означает, что фактическое значение свойства определяется через одноименные свойства всех родителей, а для формы значение свойства выбирается платформой автоматически. Обход родительских элементов прекратится в тот момент, когда нужное свойство будет установлено в значение, отличное от значения Авто.

Также следует помнить, что если у группирующего элемента значение свойства Горизонтальное положение отлично от Лево, то у подчиненных элементов перестает работать выравнивание заголовков.

7.7.13.7. Разделители элементов

В ряде случаев платформа может сформировать на форме разделители. Это специальные элементы формы, с помощью которых можно менять размеры смежных элементов формы.

Рис. 294. Разделитель

Разделитель автоматически формируется при размещении элементов формы при соблюдении всех нижеперечисленных условий:

1. Оба разделяемых элемента растягиваются в соответствующем направлении.

2. Между разделяемыми элементами нет других элементов (они располагаются рядом).

3. Высота каждого их разделяемых элементов не менее 2 строк.

4. Значение свойства Ширина (или Высота, в зависимости от ориентации разделителя) каждого из разделяемых элементов формы больше минимальной ширины (высоты) и меньше максимальной ширины (высоты) элемента формы. Максимальные размеры задаются с помощью свойств Максимальная… или АвтоМаксимальная…. Минимальная ширина и высота автоматически определяются платформой.

5. Ни один из разделяемых элементов не является надписью с автоматическим переносом текста.

6. Размер соответствующего интервала между элементами родительской группы (или формы) достаточен для размещения разделителя.

7. У родительской группы (или формы) нет дочерних элементов типа Группа вида Обычная группа с выключенным свойством Объединенная.

7.8. Командный интерфейс формы

Командный интерфейс формы состоит:

● из панели навигации формы,

● командной панели самой формы.

Имеется возможность редактирования командного интерфейса формы: включение новых, использование имеющихся команд и т. д.

Заметим, что командный интерфейс формы редактируется на отдельной закладке в редакторе формы и описывает состав панели навигации вспомогательного окна, в котором отображается форма, и частично состав командной панели формы. В основном этот механизм нужен для настройки команд глобального интерфейса, которые необходимо отображать в форме в этих двух панелях. Состав командной панели формы определяется и непосредственно в структуре элементов, и в редакторе командного интерфейса.

Команда автоматически попадает в командный интерфейс формы, в случае если тип параметра параметризованной команды совпадает с типом основного реквизита формы.

Кроме того, можно принудительно добавить команду в нужную панель командного интерфейса. Для этого достаточно просто перетащить ее в нужную группу нужной командной панели.

Установленный признак Автоположение показывает, что будет использована последовательность команд, формируемая системой по умолчанию. Если его отключить, то можно редактировать порядок команд.

Для того чтобы настроить видимость команд, которые расположены в панелях командного интерфейса, можно снять флажок в колонке Автовидимость и изменить значение в колонке Видимость.

7.9. Работа с формой из встроенного языка

7.9.1. Открытие формы

Для того чтобы открыть форму, существуют два способа:

● Воспользоваться методом ОткрытьФорму()/ОткрытьФормуМодально().

● Воспользоваться комбинацией метода ПолучитьФорму() и метода Открыть() или ОткрытьМодально() объекта УправляемаяФорма.

В любом из перечисленных случаев можно передать в открываемую форму параметры формы.

Использовать метод ОткрытьФорму() рекомендуется во всех случаях, кроме необходимости открыть форму в модальном режиме и затем получить результат работы формы через реквизиты открываемой формы.

Такая особенность связана с тем, что в качестве значения возврата модальной формы будут выступать те данные, которые возвращает сама форма, и у разработчика не будет доступа к объекту УправляемаяФорма, чтобы получить реквизиты формы. Если предварительно получить форму методом ПолучитьФорму(), доступ к реквизитам можно будет получить после завершения работы метода ОткрытьМодально().

Пример 1:

Копировать в буфер обмена
// Откроем форму списка справочника товары
// в режиме "только просмотр"
Параметры = Новый Структура("ТолькоПросмотр", Истина);
ОткрытьФорму("Справочник.Товары.ФормаСписка", Параметры);

Пример 2:

Копировать в буфер обмена
// Открыть модальную форму и после закрытия
// получить доступ к реквизитам формы
Форма = ПолучитьФорму("ОбщаяФорма.ВыборПериода");
Результат = Форма.ОткрытьМодально();
Если Результат = КодВозвратаДиалога.Да Тогда
    ДатаНачала = Форма.ДатаНачала;
    ДатаОкончания = Форма.ДатаОкончания;
КонецЕсли;

Описание работы с параметрами формы см. здесь.

Примечание. Не следует выполнять программное открытие и закрытие одной и той же формы в одном вызове встроенного языка.

Не рекомендуется размещать в обработчике события формы ПриОткрытии программный код по открытию какой-либо другой формы, так как это может привести к нарушению порядка отображения окон. В этом случае рекомендуется использовать обработчик ожидания на короткий интервал времени или открывать другие формы интерактивно, например, по нажатию на кнопку.

7.9.2. Переопределение открываемой формы

В прикладных системах может возникать задача открытия различных форм при различных параметрах объекта (или текущего окружения). Например, для элемента справочника Номенклатура нужно открывать разные формы для собственно товара и для услуги. Или для некоторого автоматизированного рабочего места нужно открывать разные формы в зависимости от текущих настроек пользователя.

Для выполнения такой задачи в модуле менеджера объекта следует создать обработчик события ОбработкаПолученияФормы. В этом обработчике нужно выполнить все необходимые проверки и принять решение о том, какую форму следует открывать. Данный обработчик вызывается только в том случае, если происходит попытка открыть стандартную форму объекта с помощью имен форм по умолчанию.

Так, при открытии формы элемента справочника Номенклатура в следующем случае обработчик будет вызван.

Копировать в буфер обмена
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта");

Однако обработчик не будет вызван, если попытаться открыть форму следующим образом.

Копировать в буфер обмена
ОткрытьФорму("Справочник.Товары.Форма.ФормаЭлемента");

Рассмотрим пример с разными формами формы элемента справочника более подробно.

При открытии формы будет выполняться анализ реквизита Вид справочника Номенклатура, и в том случае, если значение этого свойства равно значению Перечисления.ВидыТоваров.Услуга, открывать форму ФормаУслуги справочника Номенклатура.

Копировать в буфер обмена
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    Если ВидФормы = "ФормаОбъекта" И Параметры.Ключ.Вид = Перечисления.ВидыТоваров.Услуга Тогда
        ВыбраннаяФорма = Метаданные.Справочники.Товары.Формы.ФормаУслуги;
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

Данный обработчик следует разместить в модуле менеджера справочника Номенклатура.

Примечание. Обработчик ОбработкаПолученияФормы не вызывается при попытке открытия общих форм, форм констант, форм хранилищ настроек, внешних отчетов и внешних обработок.

7.9.3. Модификация свойств элементов формы

В процессе работы с формой возникают ситуации, когда необходимо изменять какие-либо свойство элементов формы, например, доступность элементов.

Для выполнения этих действий следует воспользоваться коллекцией Элементы. Данная коллекция предоставляет доступ к списку всех элементов формы (без учета иерархии).

Для доступа к иерархии элементов предназначены свойства Родитель и ПодчиненныеЭлементы (для элементов группа, таблица и для собственно формы).

Так, отключение доступности элемента формы ВидЦены выполняется следующим образом:

Копировать в буфер обмена
Элементы.ВидЦены.Доступность = Ложь;

Следует обратить внимание на особенность установки свойств ТолькоПросмотр, Доступность и Видимость для элементов, содержащих подчиненные элементы. Установка свойства для родительского элемента оказывает влияние также на все подчиненные элементы формы. При этом значение изменяемого свойства самого элемента не изменяется. Другими словами, фактическое значение свойств ТолькоПросмотр, Доступность и Видимость конкретного элемента формы определяется как сложение «по И» значений этих свойств всех родителей данного элемента.

Например, мы имеем группу ВалютаДокумента, которая состоит из полей ввода Валюта и КурсВалюты. Если необходимо сделать всю группу недоступной, достаточно выполнить следующее:

Копировать в буфер обмена
Элементы.ВалютаДокумента.Доступность = Ложь;

совет. При программной модификации свойств элементов формы следует избегать неоправданной модификации свойств, для которых в синтакс-помощнике указано Изменение свойства на клиенте требует обращения к серверу. Это замедляет работу формы и требует лишних обращений к серверу.

Примечание. Если модификация элементов формы приводит к изменению расположения элементов на форме (например, при изменении видимости элементов формы), то возможны вызовы различных обработчиков событий, связанных с активизацией элементов (например, будет вызвано событие ПриАктивизацииСтроки у таблицы).

Программное изменение свойства Вид у элемента формы, обладающего расширением (поле, таблица, группа, декорация), приводит к созданию нового расширения элемента формы. Свойства элемента формы, относящиеся к расширению, устанавливаются в значения по умолчанию и не переносятся из расширения элемента, которое было до изменения свойства Вид.

Примечание. Следует помнить, что свойства элементов формы, относящиеся к отображаемым данным (например, ПутьКДанным, ПутьКДаннымЗаголовка и т. д.), можно изменять только для новых элементов формы или после смены вида элемента формы.

7.9.4. Модификация формы

Существует возможность программной модификации формы. Для модификации (создания, изменения и удаления) доступны:

● реквизиты формы,

● локальные команды формы,

● элементы формы.

Примечание. Удалять можно только те объекты, которые созданы из встроенного языка.

Общую схему программной работы с формой можно представить следующим образом:

● изменение состава реквизитов формы,

● изменение состава команд формы,

● изменение состава элементов формы.

Отдельно следует заметить, что работа по добавлению, изменению и удалению составных частей формы возможна только на сервере. Также стоит обратить внимание на тот факт, что на программную модель формы не оказывают влияния пользовательские настройки и функциональные опции формы.

При выполнении пользовательских настроек пользователь будет настраивать именно ту форму, которую он видит (с учетом программных модификаций формы). Если пользователь добавляет какие-либо элементы формы, то обращение к таким элементам из встроенного языка невозможно. Об этой особенности следует помнить и при разработке механизмов взаимодействия с пользователем. Так, например, если в элемент формы Группа вида Страницы пользователь добавит страницу, то при переходе на эту страницу свойство группы ТекущаяСтраница станет равно Неопределено. Свойство формы ТекущийЭлемент также будет содержать значение Неопределено в том случае, когда активным элементом формы является элемент, добавленный пользователем.

Более подробно рассмотрим все этапы модификации формы.

7.9.4.1. Изменение состава реквизитов

Изменение (добавление и удаление) реквизитов выполняется методом ИзменитьРеквизиты() объекта УправляемаяФорма. При этом действия удаления и добавления выполняются за один вызов. Это позволяет выполнять операцию изменения свойств реквизитов формы. При этом следует понимать, что операция изменения состава реквизитов является ресурсоемкой операцией (фактически происходит полное создание формы), именно поэтому операции изменения состава реквизитов формы выполняются пакетным образом.

Рассмотрим подробнее методику создания реквизитов.

Вначале нам необходимо создать нужное количество объектов типа РеквизитФормы. При создании реквизита мы указываем его имя, тип реквизита и то место в иерархии реквизитов формы (см. здесь), которое будет занимать создаваемый реквизит.

Так, если мы создаем таблицу значений из двух колонок, то программный код для их создания будет выглядеть следующим образом:

Копировать в буфер обмена
МоиРеквизиты = Новый Массив;
МоиРеквизиты.Добавить(Новый РеквизитФормы("ТаблицаДанных", Новый ОписаниеТипов("ТаблицаЗначений"), , "Таблица значений", Ложь));
МоиРеквизиты.Добавить(Новый РеквизитФормы("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"), "ТаблицаДанных", "Кто поставляет", Ложь));
МоиРеквизиты.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"), "ТаблицаДанных", "Имя товара", Ложь));

Следует обратить внимание, что для двух последних реквизитов предпоследний параметр указывает, для какого реквизита будут создаваться колонки. Другими словами, существует возможность добавлять колонки для реквизитов тех типов, которые это позволяют.

На рис.295 изображены реквизиты, созданные в редакторе формы, аналог которых создает код, приведенный выше.

Рис. 295. Эквивалент программному коду

После того как были созданы все реквизиты, которые планировалось создать в форме, следует выполнить изменение списка реквизитов:

Копировать в буфер обмена
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);

Выполнение данного кода приведет к тому, что система вначале удалит реквизиты, перечисленные в массиве УдаляемыеРеквизиты, а затем выполнит добавление реквизитов из массива ДобавляемыеРеквизиты. После чего произойдет перестроение формы.

При удалении реквизитов происходит потеря данных, которые в них содержатся, однако если добавляемый и удаляемый реквизит имеют совместимые типы или добавляемый реквизит отличается от удаляемого реквизита только свойствами (но не типом), то данные, хранимые реквизитом, будут сохранены.

После добавления реквизита обращение к нему в программном коде возможно только с помощью конструкции ЭтотОбъект.ИмяРеквизита. Выражение «ЭтотОбъект.» является обязательным для программно добавляемых реквизитов.

Для того чтобы изменить состав или свойства реквизитов, следует вначале получить изменяемые реквизиты. Сделать это можно с помощью метода ПолучитьРеквизиты().

Следует обратить внимание на две особенности полученного списка:

● данный список не является динамическим и не отслеживает изменения реквизитов, которые произошли после вызова метода;

● несмотря на то, что полученный список можно изменять, эти изменения никак не отразятся на реальных свойствах реквизитов формы.

После того как получен интересующий нас список реквизитов формы, можно выполнить с полученными реквизитами какие-либо действия (например, изменить заголовки всех реквизитов) и затем выполнить метод изменения реквизитов. Изменение реквизитов следует делать с предварительным удалением.

Например, если мы хотим изменить свойства реквизита ПараметрЗаказа, то это следует делать таким образом:

Копировать в буфер обмена
МассивРеквизитов = ПолучитьРеквизиты("ПараметрЗаказа");
...
// Выполним изменения реквизита
...
УдаляемыеРеквизиты = Новый Массив;
УдаляемыеРеквизиты.Добавить("ПараметрЗаказа");
ИзменитьРеквизиты(МассивРеквизитов, УдаляемыеРеквизиты);

7.9.4.2. Изменение состава команд

Для того чтобы управлять составом команд формы, у объекта УправляемаяФорма существует специальная коллекция – Команды. С помощью этой коллекции мы можем добавлять, удалять и изменять команды формы.

Так, для добавления команды КомандаУстановкиСтатуса с заголовком Установить статус, которая будет вызывать обработчик с именем ОбработчикПрограммныхКоманд, необходимо выполнить следующий программный код:

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Команда = Команды.Добавить("КомандаУстановкиСтатуса");
    Команда.Действие = "ОбработчикПрограммныхКоманд";
    Команда.Заголовок = "Установить статус";
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикПрограммныхКоманд(Команда)
    ...
КонецПроцедуры

Обработчик команды должен существовать в модуле формы и предваряться директивой компиляции &НаКлиенте.

Примечание. Один обработчик может обслуживать несколько программно добавляемых команд.

7.9.4.3. Работа с элементами формы

После того как созданы все необходимые реквизиты и команды, можно добавлять элементы управления.

Для управления элементами формы у объекта УправляемаяФорма существует коллекция Элементы, с помощью которой можно добавлять, удалять, изменять свойства элементов формы, а также перемещать элементы формы между родителями.

Коллекция Элементы предоставляет доступ к списку элементов формы, который не учитывает возможную иерархию элементов. Для работы с иерархией у объекта коллекции Элементы существуют свойства Родитель и ПодчиненныеЭлементы.

Первое свойство указывает на родительский элемент формы, например, для поля формы, расположенного в группе, свойство Родитель будет указывать на элемент формы типа ГруппаФормы.

Свойство ПодчиненныеЭлементы существует у тех элементов формы, которые могут иметь подчиненные элементы. Например, для элемента формы типа ГруппаФормы коллекция ПодчиненныеЭлементы будет содержать те элементы, которые расположены в этой группе.

Для перемещения элемента из одной коллекции в другую (например, из одной группы в другую) существует метод Переместить(). Параметры данного метода описывают перемещаемый элемент, нового родителя элемента и тот элемент формы, перед которым нужно поместить перемещаемый элемент.

Если последний параметр метода не указан, то перемещаемый элемент будет размещен в конце коллекции элементов нового родителя.

Примечание. При программном изменении состава элементов формы возможны вызовы различных обработчиков событий, связанных с активизацией элементов (например, будет вызвано событие ПриАктивизацииСтроки у таблицы).

Рассмотрим подробнее способ добавления элемента управления.

В примере показано, как разместить на форме два элемента:

● поле формы, связанное с реквизитом формы;

● кнопку, связанную с командой формы.

Копировать в буфер обмена
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    МоиРеквизиты = Новый Массив;
    ТипСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки());
    МоиРеквизиты.Добавить(Новый РеквизитФормы("ОписаниеОбъекта", ТипСтрока, "", "Описание объекта", Ложь));
    ИзменитьРеквизиты(МоиРеквизиты);
    Команда = Команды.Добавить("ИзменитьСтроку");
    Команда.Действие = "ОбработчикПрограммныхКоманд";
    Команда.Заголовок = "Изменить строку";
    Элемент = Элементы.Добавить("ОписаниеОбъекта", Тип("ПолеФормы"));
    Элемент.Вид = ВидПоляФормы.ПолеВвода;
    Элемент.ПутьКДанным = "ОписаниеОбъекта";
    Элемент = Элементы.Добавить("ИзменитьСтроку", Тип("КнопкаФормы"));
    Элемент.ИмяКоманды = "ИзменитьСтроку";
КонецПроцедуры
...
&НаКлиенте
Процедура ОбработчикПрограммныхКоманд(Команда)
    ЭтотОбъект.ОписаниеОбъекта = "Описание объекта, сформированное командой";
КонецПроцедуры

Форма, в которой будет размещен этот код, будет выглядеть как на рис.296. Форма показана после того, как пользователь нажал кнопку Изменить строку.

Рис. 296. Результат программной модификации формы

7.9.5. Работа с динамическим списком

В данном разделе приведены примеры выполнения некоторых операций по работе с динамическим списком, размещенным в форме.

Примечание. Примеры, приведенные ниже, не являются законченным. Они предназначены для демонстрации различных механизмов работы с динамическим списком.

7.9.5.1. Параметр запроса динамического списка

В данном разделе приведен пример установки параметра запроса динамического списка.

Предположим, что для динамического списка указан следующий запрос к данным:

Копировать в буфер обмена
ВЫБРАТЬ
    Товары.Код КАК Код,
    Товары.Наименование КАК Наименование,
    Товары.Артикул КАК Артикул,
    ТоварныеЗапасыОстатки.КоличествоОстаток КАК Количество,
    ЦеныТоваровСрезПоследних.Цена КАК Цена,
    Товары.ЭтоГруппа
ИЗ
    Справочник.Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(, Склад = &Склад) КАК ТоварныеЗапасыОстатки
        ПО (ТоварныеЗапасыОстатки.Товар = Товары.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(, ВидЦен = &ВидЦен) КАК ЦеныТоваровСрезПоследних
        ПО Товары.Ссылка = ЦеныТоваровСрезПоследних.Товар

Тогда для установки параметров данного запроса (в обработчике ПриСозданииНаСервере()) нужно указать параметры Склад и ВидЦен следующим образом.

Копировать в буфер обмена
// СписокТоваров – реквизит формы типа ДинамическийСписок
// Параметры.Склад и Параметры.ВидЦен – параметры формы соответствующих типов
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    СписокТоваров.Параметры.УстановитьЗначениеПараметра("Склад", Параметры.Склад); 
    СписокТоваров.Параметры.УстановитьЗначениеПараметра("ВидЦен", Параметры.ВидЦен); 
КонецПроцедуры

7.9.5.2. Отбор

В данном разделе приведены примеры установки и удаления отбора в динамическом списке.

Установить

Функция добавляет отбор в динамический список и возвращает созданный элемент отбора.

Копировать в буфер обмена
Функция ДобавитьОтбор(СписокОтборов, ИмяПоля, Значение, ВидСравнения = Неопределено, Использование = Истина)
    НовыйЭлемент = СписокОтборов.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    НовыйЭлемент.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения);
    НовыйЭлемент.ПравоеЗначение = Значение;
    НовыйЭлемент.Использование = Использование;
    Возврат НовыйЭлемент;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок – реквизит формы типа "ДинамическийСписок"
// В списке должна быть колонка "Контрагент"
//
// Выполняется установка отбора по полю "Контрагент", значение
// отбора находится в переменной "КонтрагентСсылка", отбор включен,
// условие отбора – равно.
ДобавитьОтбор(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, "Контрагент", КонтрагентСсылка);

Удалить

Процедура удаляет отбор динамического списка и возвращает результат удаления. Если имя поля с удаляемым отбором не указано, выполняется очистка списка отборов.

Копировать в буфер обмена
Функция УдалитьОтбор(СписокОтборов, ИмяПоля = "")
    Если ПустаяСтрока(ИмяПоля) Тогда
        СписокОтборов.Элементы.Очистить();
        Возврат Истина;
    КонецЕсли;
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ОтборУдален = Ложь;
    Для каждого ЭлементОтбора Из СписокОтборов.Элементы Цикл
        Если ЭлементОтбора.Использование И ЭлементОтбора.ЛевоеЗначение = Поле Тогда
            СписокОтборов.Элементы.Удалить(ЭлементОтбора);
            ОтборУдален = Истина;
        КонецЕсли;
    КонецЦикла;
    Возврат ОтборУдален;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок – реквизит формы типа "ДинамическийСписок"
//             В списке должна быть колонка "Контрагент"
// Выполняется удаление отбора по полю "Контрагент".
Результат = УдалитьОтбор(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, "Контрагент");

7.9.5.3. Группировка

В данном разделе приведены примеры установки и удаления группировки в динамическом списке.

Установка

Функция добавляет группировку в динамический список и возвращает созданный элемент группировки.

Копировать в буфер обмена
Функция ДобавитьГруппировку(СписокГруппировок, ИмяПоля, Использование = Истина, ТипГруппировки = Неопределено)
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    НовыйЭлемент = СписокГруппировок.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    НовыйЭлемент.Использование = Использование;
    НовыйЭлемент.Поле = Поле;
    НовыйЭлемент.ТипГруппировки = ?(ТипГруппировки = Неопределено, ТипГруппировкиКомпоновкиДанных.Элементы, ТипГруппировки);
    Возврат НовыйЭлемент;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок – реквизит формы типа "ДинамическийСписок"
// В списке должна быть колонка "Контрагент"
//
// Выполняется создание группировки по полю "Контрагент", созданная
// группировка будет использоваться, тип группировки – только элементы
Группировка = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ДобавитьГруппировку(Группировка.ПоляГруппировки, "Контрагент");

Удаление

Процедура удаляет группировку динамического списка и возвращает результат удаления. Если имя поля с удаляемой группировкой не указано, выполняется очистка списка группировок.

Копировать в буфер обмена
Функция УдалитьГруппировку(СписокГруппировок, ИмяПоля = "")
    Если ПустаяСтрока(ИмяПоля) Тогда
        СписокГруппировок.Элементы.Очистить();
        Возврат Истина;
    КонецЕсли;
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ГруппировкаУдалена = Ложь;
    МассивЭлементовДляУдаления = Новый Массив;
    Для каждого ЭлементГруппировки из СписокГруппировок.Элементы Цикл
        Если ЭлементГруппировки.Поле = Поле тогда
            МассивЭлементовДляУдаления.Добавить(ЭлементГруппировки);
        КонецЕсли;
    КонецЦикла;
    Для каждого УдаляемыйЭлемент из МассивЭлементовДляУдаления Цикл
        СписокГруппировок.Элементы.Удалить(УдаляемыйЭлемент);
        ГруппировкаУдалена = Истина;
    КонецЦикла;
    Возврат ГруппировкаУдалена;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок – реквизит формы типа "ДинамическийСписок"
//
// Выполняется удаление всех группировок в динамическом списке
Результат = УдалитьГруппировку(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Группировка);

7.9.5.4. Порядок (сортировка)

В данном разделе приведены примеры установки и удаления упорядочивания динамического списка.

Установка

Функция добавляет поле сортировки в динамический список и возвращает созданный элемент порядка.

Копировать в буфер обмена
Функция ДобавитьПорядок(СписокПорядков, ИмяПоля, Использование = истина, ТипУпорядочивания = Неопределено)
    Поле = Новый ПолеКомпоновкиДанных(Поле);
    НовыйЭлемент = СписокПорядков.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    НовыйЭлемент.Использование = Использование;
    НовыйЭлемент.Поле = Поле;
    НовыйЭлемент.ТипУпорядочивания = ?(ТипУпорядочивания = Неопределено, НаправлениеСортировкиКомпоновкиДанных.Возр, ТипУпорядочивания);
    Возврат НовыйЭлемент;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок – реквизит формы типа "ДинамическийСписок"
// В списке должна быть колонка "Наименование"
//
// Выполняется установка сортировки по полю "Наименование",
// направление сортировки – по убыванию, сортировка используется
ДобавитьПорядок(ДинамическийСписок.КомпоновщикНастроек.Настройки.Порядок, "Наименование", НаправлениеСортировкиКомпоновкиДанных.Убыв);

Удаление

Процедура удаляет сортировку динамического списка и возвращает результат удаления. Если имя поля упорядочивания не указано, выполняется очистка списка упорядочивания.

Копировать в буфер обмена
&НаКлиенте
Функция УдалитьПорядок(СписокПорядков, ИмяПоля = "")
    Если ПустаяСтрока(ИмяПоля) Тогда
        СписокПорядков.Элементы.Очистить();
        Возврат Истина;
    КонецЕсли;
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ПорядокУдален = Ложь;
    МассивЭлементовДляУдаления = Новый Массив;
    Для каждого ЭлементПорядка из СписокПорядков.Элементы Цикл
        Если ЭлементПорядка.Поле = Поле тогда
            МассивЭлементовДляУдаления.Добавить(ЭлементПорядка);
        КонецЕсли;
    КонецЦикла;
    Для каждого УдаляемыйЭлемент из МассивЭлементовДляУдаления Цикл
        СписокПорядков.Элементы.Удалить(УдаляемыйЭлемент);
        ПорядокУдален = Истина;
    КонецЦикла;
    Возврат ПорядокУдален;
КонецФункции

Пример использования:

Копировать в буфер обмена
// ДинамическийСписок – реквизит формы типа "ДинамическийСписок"
//
// Выполняется удаление (не отключение) порядка по полю "Наименование"
Результат = УдалитьПорядок(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Порядок, "Наименование");

7.9.5.5. Условное оформление

В данном разделе приведены примеры задания условного оформления динамического списка. В условном оформлении используется динамический список Список, в котором есть поля Организация и Сумма (типа Число). В примере задаются три элемента условного оформления:

● если значение поля Сумма меньше 500, то текст полей Организация и Сумма оформляется красным цветом;

● если значение поля Сумма больше 500, но меньше 10 000, то для всех полей строки текст оформляется синим цветом;

● если значение поля Сумма больше 10 000, то текст полей Организация и Сумма оформляется зеленым цветом.

Также в примере используется функция установки отбора (см. здесь).

Копировать в буфер обмена
Функция УстановитьУсловноеОформление(СписокОформления, ИменаОформляемыхПолей, СтруктураОформление, Использование = Истина) Экспорт
    НовыйЭлемент = СписокОформления.Элементы.Добавить();
    НовыйЭлемент.Использование = Использование;
    // Зададим оформляемые поля, заданные массивом с именами полей
    Для каждого ИмяПоля Из ИменаОформляемыхПолей Цикл
        ОформляемоеПоле = НовыйЭлемент.Поля.Элементы.Добавить();
        ОформляемоеПоле.Использование = Истина;
        ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    КонецЦикла;
    // Зададим оформление, заданное структурой,
    // в которой – Ключ: имя параметра оформления,
    //    а Значение – значение параметра оформления
    Для каждого ЭлементОформления Из СтруктураОформление Цикл
        НовыйЭлемент.Оформление.УстановитьЗначениеПараметра(ЭлементОформления.Ключ, ЭлементОформления.Значение);
    КонецЦикла;
    Возврат НовыйЭлемент;
КонецФункции

Пример задания условного оформления:

Копировать в буфер обмена
ЭлементыУсловногоОформления = Список.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление;
ОформляемыеПоля = Новый Массив;
ОформляемыеПоля.Добавить("Сумма");
ОформляемыеПоля.Добавить("Организация");
// ***** Установка красного цвета для суммы менее 500
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(128,0,0));
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, ОформляемыеПоля, Оформление);
// Зададим условие оформления: Сумма < 500
ДобавитьОтбор(НовыйЭлемент.Отбор, "Сумма", 500, ВидСравненияКомпоновкиДанных.Меньше);
// ***** Установка зеленого цвета для суммы более 10 000
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(0,128,0));
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, ОформляемыеПоля, Оформление);
Зададим условие оформления: Сумма > 10 000
ДобавитьОтбор(НовыйЭлемент.Отбор, "Сумма", 10000, ВидСравненияКомпоновкиДанных.Больше);
// установка синего цвета, если сумма в интервале от 500 до 10 000
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(0,0,128));
// Передача пустого массива в качестве списка оформляемых полей
// означает оформление всех полей строки
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, Новый Массив, Оформление);
// Cоздадим группу условий "И"
ГруппаОтборов = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтборов.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
// Зададим условие оформления: Сумма > 500 И Сумма < 10 000
ДобавитьОтбор(ГруппаОтборов, "Сумма", 500, ВидСравненияКомпоновкиДанных.Больше);
ДобавитьОтбор(ГруппаОтборов, "Сумма", 10000, ВидСравненияКомпоновкиДанных.Меньше);

7.9.6. Механизм перетаскивания

В «1С:Предприятии» поддерживается операция перетаскивания. С ее помощью можно осуществлять перенос данных между разными элементами формы. Например, можно переносить элементы списка справочника из одной группы в другую, переносить данные из табличного поля в поле табличного документа или перенести список выделенных файлов из проводника Microsoft Windows в какой-либо элемент формы.

Операции перетаскивания поддерживают следующие элементы формы:

● таблица формы,

● поле табличного документа,

● поле календаря,

● поле картинки,

● декорация-картинка.

При операциях перетаскивания используются следующие термины:

источник данных – элемент формы, из которого можно перетаскивать данные;

приемник данных – элемент формы, в который можно перетаскивать данные.

Существует возможность разрешать или запрещать элементам управления предоставлять или принимать данные, т. е. быть источником или приемником данных. Для этого у элементов формы существуют следующие свойства:

Разрешить начало перетаскивания – разрешает элементу формы предоставлять данные.

Разрешить перетаскивание – разрешает элементу формы принимать данные. Эти свойства можно устанавливать из палитры свойств или из встроенного языка.

При нажатии кнопки мыши на выделенной области элемента управления у элемента управления – источника данных вызывается обработчик события НачалоПеретаскивания. В качестве параметров данного события передаются объекты типа ПараметрыПеретаскивания и Выполнение. Параметр ПараметрыПеретаскивания имеет следующие свойства:

Значение – содержит перетаскиваемое значение, например, для таблицы управляемой формы это может быть ссылка на объект, для табличного документа – область табличного документа, для календаря – дата. Можно присвоить этому свойству свое значение (например, какую-нибудь структуру), тогда это значение будет являться перетаскиваемым объектом. Для таблицы управляемой формы, связанной с реквизитом формы типа ДанныеФормыКоллекция, ДанныеФормыДерево или ДанныеФормыСтруктраСКоллекцией, в качестве значения перетаскивания передается:

● идентификатор строки (или массив идентификаторов), если перетаскивание осуществляется в рамках одной таблицы;

● элемент коллекции (или массив элементов), если перетаскивание осуществляется между разными таблицами.

При выполнении операции перетаскивания из поля планировщика (см. здесь), свойство Значение содержит копии перетаскиваемых элементов.

Действие – указывает действие перетаскивания и является значением типа ДействиеПеретаскивания.

ДопустимыеДействия – указывает допустимые действия перетаскивания и является значением типа ДопустимыеДействияПеретаскивания. При помощи этого свойства можно указать, какие операции возможны с данными источника данных (например, только копирование).

Параметр Выполнение позволяет разрешить или запретить стандартную обработку операции перетаскивания из данного элемента управления. Для события НачалоПеретаскивания стандартной обработкой является начало перетаскивания данных.

Далее у элемента формы – приемника данных вызывается обработчик события ПроверкаПеретаскивания. Данный обработчик вызывается всякий раз, когда курсор попадает на новый объект в элементе формы – приемнике данных (например, в новую ячейку таблицы или поля табличного документа, при попадании в новую дату в поле календаря). Набор параметров данного события зависит от элемента формы – приемника данных, но первые два параметра у всех одинаковы. Это объекты типа ПараметрыПеретаскивания и СтандартнаяОбработка. Остальные параметры описывают объект под курсором. При обработке данного события можно управлять видом курсора, т. е. например, указывать, что перетаскивание в данный элемент управления запрещено или возможно только копирование. Для этого нужно установить необходимое действие в свойстве Действие параметра ПараметрыПеретаскивания. Необходимо учитывать, что устанавливаемое действие перетаскивания должно быть разрешенным, т. е. не вступать в противоречие со значением свойства ДопустимыеДействия. Например, действие Копирование не вступает в противоречие со значением допустимых действий КопированиеИПеремещение, а значение Перемещение вступает в противоречие со значением допустимых действий Копирование. Параметр СтандартнаяОбработка используется для указания возможности стандартной обработки элементом формы данного события. Стандартная обработка перетаскивания зависит от типа элемента управления:

● Для таблицы проверяется возможность вставки значения, т. е. проверяется тип значения, и, если он совпадает с типом отображаемых данных, производятся стандартные действия. Стандартные действия для иерархических динамических списков – перемещение в группу, для таблиц, отображающих наборы записей или табличные части, – изменение порядка строк и копирование.

Если у таблицы свойство ИзменятьПорядокСтрок установлено в значение Ложь, то при перетаскивании внутри таблицы стандартная обработка отменяет перетаскивание и событие Перетаскивание вызвано не будет.

Если свойство ИзменятьПорядокСтрок установлено в значение Истина или перетаскивание осуществляется извне таблицы, стандартная обработка не отменяет перетаскивание.

Стандартная обработка не отменяет перетаскивание, если у таблицы свойство РежимВыделения установлено в значение Множественный, свойство ИзменятьПорядокСтрок установлено в значение Истина или перетаскивание осуществляется извне таблицы, и перетаскивается более одного элемента.

● Для таблицы, отображающей дерево, стандартная обработка перетаскивания осуществляется следующим образом:

● При перетаскивании элементов дерева внутри одного узла осуществляется изменение порядка следования элементов дерева внутри узла.

● При перетаскивании элементов дерева между различными узлами осуществляется перемещение элементов дерева в выбранный узел.

● Для поля табличного документа – проверка возможности вставить передаваемое значение.

● Для поля картинки и календаря стандартной обработки нет.

Если отпустить клавишу мыши в элементе формы – приемнике данных, вызывается обработчик события Перетаскивание. Набор параметров этого события тот же, что и у события ПроверкаПеретаскивания. Параметр СтандартнаяОбработка позволяет разрешить или запретить стандартную обработку события элементом формы. Стандартные действия перетаскивания описаны выше.

Затем в элементе управления – источнике данных вызывается обработчик события ОкончаниеПеретаскивания. При обработке этого события элемент формы – приемник данных может, например, удалить перемещенные данные или очистить какие-либо переменные.

7.9.7. Различные подходы к модальности

7.9.7.1. Общая информация

В прикладных решениях, разрабатываемых с помощью системы «1С:Предприятие», часто возникает необходимость открыть форму, которая будет предоставлять одновременно несколько возможностей:

● Блокировать работу с другими фрагментами интерфейса прикладного решения;

● Позволять ввести какую-либо информацию (включая ответ на вопрос);

● Останавливать исполнение кода прикладного решения до момента, пока не будет завершена работа с открытой формой.

Причем рассматриваемые формы могут быть созданы прикладным разработчиком на встроенном языке «1С:Предприятие» и являться частью самой платформы (например формы, которые открывают методы Предупреждение(), Вопрос() и т. д.).

В рамках системы «1С:Предприятие» существуют две схемы использования таких форм:

● Модальные окна;

● Блокирующие окна.

В рамках одного прикладного решения может использовать или какой-либо один подход или смешанная модель. Для управления такой возможностью существует специальное свойство конфигурации – Режим использования модальности (см. здесь).

Первая схема использования модальности (модальные окна) предполагает использование особых типов окон операционной системы – модальные окна. В случае использования этой схемы исполнение кода на встроенном языке останавливается до тех пор, пока модальная форма не будет закрыта. Значение возврата будет получено непосредственно в месте открытия модальной формы и сразу после этого (в том же методе) можно выполнять какие-либо действия с этим значением: проанализировать, использовать в алгоритме и т. д. Модальные окна можно открыть с помощью методов ОткрытьФормуМодально() или Предупреждение(). Однако, модальные окна не поддерживаются при работе на устройствах iPad и плохо поддерживаются в веб-клиенте.

В этих случаях рекомендуется использовать схему использования модальности с помощью блокирующих окон. Основное отличие блокирующего окна от модального заключается в том, что открытие блокирующего окна не останавливает исполнение кода на встроенном языке. Получение результата работы блокирующего окна выполняется с помощью специальной процедуры обратного вызова. Следствием этой особенности является тот, что алгоритм, использующий модальные вызовы для управления своей работой, будет необходимо полностью переработать для использования с блокирующими окнами.

С точки зрения прикладного разработчика, разница между двумя схемами использования модальных окон будет продемонстрирована на следующем примере. Допустим, что есть некоторый клиентский обработчик, который задает пользователю вопрос и в зависимости от данного ответа выполняет одну или другую ветку прикладного кода.

Пример с модальными окнами:

Копировать в буфер обмена
&НаКлиенте
Процедура ВыполнитьАлгоритм()
    Результат = Вопрос("Выполнить быстро или не медленно?", РежимДиалогаВопрос.ДаНет);
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Первый вариант алгоритма
    Иначе
        // Второй вариант алгоритма
    КонецЕсли;
КонецПроцедуры

В этом примере (модальные окна) работа встроенного языка остановится на строке Результат = Вопрос() и продолжится только после того, как пользователь ответит на заданный вопрос.

Пример с блокирующими окнами:

Копировать в буфер обмена
&НаКлиенте
Процедура ВыполнитьАлгоритм(Команда)
    ОбратныйВызов = Новый ОписаниеОповещения("ВыполнитьАлгоритмОбратныйВызов", ЭтотОбъект);
    ПоказатьВопрос(ОбратныйВызов, "Выполнить быстро или не медленно?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьАлгоритмОбратныйВызов(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Первый вариант алгоритма
    Иначе
        // Второй вариант алгоритма
    КонецЕсли;
КонецПроцедуры

В этом примере (с использованием блокирующих окон) алгоритм оказывается разделенным на две части:

● Место, где отображается вопрос пользователю;

● Место, где обрабатывается ответ пользователя.

Но это разные фрагменты прикладного кода. После вызова метода ПоказатьВопрос() исполнение кода на встроенном языке не завершится. Однако, пользователь сможет ответить на заданный вопрос только в том случае, когда исполнение кода на встроенном языке будет завершено и управление будет передано системе «1С:Предприятие». Следовательно, в месте вызова метода, отображающего форму с вопросом, невозможно получить результат работы пользователя с открытой формой.

После того, как пользователь ответит на вопрос, будет вызвана экспортная процедура, описание которой прикладной разработчик должен передать в метод открытия блокирующего окна. Описание метода обратного вызова создается с помощью объекта ОписаниеОповещения. Метод обратного вызова может располагаться в модуле формы, модуле команды и общем модуле. Если требуется указать, что метод обратного вызова находится в том же модуле, что и вызов блокирующего окна, следует использовать значение ЭтотОбъект. Также имеется возможность передать в обработчик обратного вызова различные вспомогательные данные, которые в самом обработчике будут доступны через формальный параметр ДополнительныеПараметры. Это могут быть входные данные для работы алгоритма, различные параметры и т. д.

В общем случае, после вызова любого метода работы с блокирующими окнами, метод, содержащий такой вызов, должен сразу завершаться, а весь дальнейший код должен быть расположен в обработчике оповещения.

В том случае, если требуется организовать каскадный вызов методов обратного вызова, следует использовать метод ВыполнитьОбработкуОповещения(). Также этот метод можно использовать в тех случаях, когда реализация какого-либо действия может произойти либо сразу, либо после задания вопроса о необходимости действия. Например, при попытке перечитать файл с данными, проверяется текущее состояние редактора, и если данные в редакторе изменены – задается вопрос о возможности перечитать данные.

Пример:

Копировать в буфер обмена
&НаКлиенте
Процедура ПеречитатьДанные(Команда)
    ОбратныйВызов = Новый ОписаниеОповещения("ПеречитатьДанныеЗавершение", ЭтотОбъект, ИмяФайлаСДанными);
    Если Модифицированность Тогда
        ПоказатьВопрос(ОбратныйВызов, "Данные изменены. Перечитать?", РежимДиалогаВопрос.ДаНет);
    Иначе
        ВыполнитьОбработкуОповещения(ОбратныйВызов, КодВозвратаДиалога.Да);
    КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПеречитатьДанныеЗавершение(Результат, ИмяФайла) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        // выполним чтение данных
        Модифицированность = Ложь;
    КонецЕсли;
КонецПроцедуры

7.9.7.2. Закрытие вспомогательного или основного окна приложения и блокирующие окна

Закрытие формы может выполняться в двух сценариях работы – когда закрывается единственная форма и когда закрывается целиком все приложение (выполняется закрытие основного окна приложения). Для того чтобы разделить эти сценарии, в системе реализован отдельный процесс обработки закрытия всего приложения. Для указания, что форма закрывается во время закрытия всего приложения в обработчиках событий ПередЗакрытием, ПриЗакрытии реализован специальный параметр ЗавершениеРаботы. Кроме того, в обработчике события формы ПередЗакрытием и обработчике события ПередЗавершениемРаботы модуля управляемого приложения, реализован параметр ТекстПредупреждения. Рассмотрим данные параметры более подробно:

ЗавершениеРаботы – данный параметр устанавливается системой в значение Истина в том случае, если пользователь пытается закрыть основное окно приложения (если этот параметр существует для выбранного обработчика). При закрытии одной формы данный параметр будет установлен в значение Ложь.

ТекстПредупреждения – данный параметр должен быть сформирован в обработчике события (если этот параметр существует для выбранного обработчика).

Более подробно рассмотрим совместную работу этих параметров во время закрытия приложения. Код на встроенном языке, который обрабатывает закрытие формы с учетом указанных особенностей, будет иметь следующий вид:

Копировать в буфер обмена
&НаКлиенте
Перем ОтветПередЗакрытием;
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если НЕ ЗавершениеРаботы Тогда
        Если ОтветПередЗакрытием <> Истина Тогда
            Отказ = Истина;
            ОбратныйВызов = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
            ПоказатьВопрос(ОбратныйВызов, "Закрыть форму?", РежимДиалогаВопрос.ДаНет);
        КонецЕсли;
    Иначе
        Отказ = Истина;
        ТекстПредупреждения = "При закрытии формы все данные будут утеряны. Вы хотите";
    КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        ОтветПередЗакрытием = Истина;
        Закрыть();
    Иначе
        ОтветПередЗакрытием = Неопределено;
    КонецЕсли;
КонецПроцедуры

В приведенном примере примера реализована особая реакция на закрытие всего приложения. Обработка процесса закрытия приложения работает следующим образом:

● Если форма закрывается в процессе завершения работы приложения, то прикладной разработчик может определить это по состоянию параметра ЗавершениеРаботы и определяет, нужно выдать пользователю какое-либо сообщение, которое требует реакции пользователя: завершить работу или все-таки продолжить работу, т. к. в форме есть существенная информация.

● Если разработчик считает, что пользователю необходимо выдать сообщение, то он может это сделать с помощью параметра ТекстПредупреждения обработчика событий ПередЗакрытием или ПередЗавершениемРаботыСистемы. Параметр Отказ также следует установить в значение Истина.

● Если хотя бы одна форма или процедура обработчика события ПередЗавершениемРаботыСистемы сообщит о том, что она «не хочет» закрытия приложения, система будет формировать диалоги, требующие реакции пользователя. Количество диалогов равно количеству отказов от закрытия (включая обработчик модуля управляемого приложения). В веб-клиенте будет отображен один диалог, который будет содержать все сообщения, которые были установлены в управляемых формах и модуле управляемого приложения. При этом в веб-браузере Mozilla Firefox диалог будет содержать только текст, установленный самим веб-браузером и не будет отображаться текст, установленный в обработчиках событий системы «1С:Предприятие».

● В тонком клиенте в диалоге будет отображаться текст предупреждения, который задал разработчик, и кнопки Завершить работу и Продолжить работу. Если во всех диалогах выбрано Завершить работу – работа приложения будет завершена. Если хотя бы в одном диалоге было выбрано Продолжить работу – приложение не будет завершено и работа продолжится. В случае отказа от завершения работы на экране останется та форма, в которой была нажата кнопка Продолжить работу.

Если параметр ЗавершениеРаботы имеет значение Ложь, то это означает, что закрывается единственная форма и в этом случае логика работы выглядит следующим образом:

● Вначале задается вопрос о необходимости (возможности) закрытия формы и собственно закрытие формы отменяется.

● После того, как пользователь ответил на вопрос, в специальной клиентской переменной отмечается, что сейчас будет выполнено «настоящее» закрытие формы и форма закрывается повторно.

При обработке завершения работы приложения (параметр ЗавершениеРаботы равен значению Истина) в обработчиках ПередЗакрытием, ПриЗакрытии, а также в обработчиках ПередЗавершениемРаботыСистемы и ПриЗавершенииРаботыСистемы запрещено использование любых серверных вызовов и открытие любых форм. Из этого следует рекомендация хранить в данных формы ту информацию, которая может потребоваться для определения того, можно закрыть форму при завершении работы приложения или нет. Для существующих форм может потребоваться переработка механизмов, отвечающих за закрытие.

Таким образом, отображение диалога с кнопками Завершить работу и Продолжить работу выполняется в том случае, если при покидании обработчиков ПередЗакрытием параметры обработчика установлены следующим образом: параметр ЗавершениеРаботы установлен в значение Истина и параметр Отказ установлен в значение Истина. В этом случае в диалоге будет отображаться текст, который установлен в параметре ТекстПредупреждения. Если параметр ТекстПредупреждения не установлен, то в качестве текста предупреждения в диалоге будет показана строка Работа в данном окне не завершена.

Аналогичное поведение будет наблюдаться в том случае, если в обработчике ПередЗавершениемРаботыСистемы параметр Отказ будет установлен в значение Истина.

Во всех остальных случаях считается, что нет причин, препятствующих закрытию форм и приложения.

7.9.7.3. Особенности использования блокирующих окон

В тонком и толстом клиенте, в отличие от веб-клиента, метод НачатьПомещениеФайла() останавливает исполнение кода на встроенном языке. Тем не менее, после завершения операции вызов процедуры обратного вызова, переданной в метод НачатьПомещениеФайла(), все равно будет выполнен. Для того чтобы избежать различий в поведении при работе в тонком клиенте и веб-клиенте, следует весь код, который должен быть выполнен после помещения файла, размещать строго в обработчике обратного вызова.

Для объектов ДиалогРедактированияСтандартногоПериода, КонструкторФорматнойСтроки, ДиалогВыбораШрифта, ДиалогВыбораЦвета, ДиалогРасписанияРегламентногоЗадания в обработчик обратного вызова, который передается при вызове метода Показать(), в качестве первого параметра передается значение основного свойства закрываемого диалога, если в диалоге нажата кнопка ОК или Неопределено в остальных случаях. Например, при редактировании стандартного периода, в качестве первого параметра обработчика обратного вызова будет выступать объект СтандартныйПериод (или Неопределено).